#!/usr/bin/env bash
set -euo pipefail

APP_DATA_DIR="$(readlink -f $(dirname "${BASH_SOURCE[0]}")/../data)"
ORDINALS_DATA_DIR="${APP_DATA_DIR}/ord"
DESIRED_OWNER="1000:1000"

set_correct_permissions() {
	local -r path="${1}"

	if [[ -d "${path}" ]]; then
		owner=$(stat -c "%u:%g" "${path}")

		if [[ "${owner}" != "${DESIRED_OWNER}" ]]; then
			chown -R "${DESIRED_OWNER}" "${path}"
		fi
	fi
}

# обрабатывать создание правильного каталога данных заказа для версий до 0.15.0
if [[ -f "${APP_DATA_DIR}/index.redb" ]]; then
  rm -f "${APP_DATA_DIR}/index.redb"
  mkdir -p "${ORDINALS_DATA_DIR}"
  # установите правильные разрешения как для данных, так и для ord
  set_correct_permissions "${APP_DATA_DIR}"
fi

# переиндексировать ord при обновлении основной версии (до сих пор в истории ord это требовалось при каждом обновлении основной версии)
# Примечание по обновлению 0.23: обновление с 0.22.x до 0.23.x не требует переиндексации, см. https://x.com/rodarmor/status/1909286899275251887
# Примечание по обновлению 0.27.1: обновление с 0.23.x до 0.27.1 требует повторной индексации (версия схемы 30 -> 34)
# для новых установок этот файл будет безвредно создан
if [[ ! -f "${APP_DATA_DIR}/AT_LEAST_0-27-1" ]]; then
    # удалить индексную базу данных для всех биткойн-сетей
    for file in "${ORDINALS_DATA_DIR}/index.redb" "${ORDINALS_DATA_DIR}/testnet3/index.redb" "${ORDINALS_DATA_DIR}/testnet4/index.redb" "${ORDINALS_DATA_DIR}/regtest/index.redb" "${ORDINALS_DATA_DIR}/signet/index.redb"; do
        if [[ -f "${file}" ]]; then
            rm -f "${file}"
        fi
    done
    touch "${APP_DATA_DIR}/AT_LEAST_0-27-1"
fi

# перенести все файлы базы данных кошелька в ord/wallets, ord/testnet3/wallets, ord/regtest/wallets и ord/signet/wallets для версий до 0.18.2: https://github.com/ordinals/ord/releases/tag/0.18.2
# безымянный кошелек по умолчанию из `ord wallet create` называется ord.redb, но пользователи могут создавать именованные кошельки как <anything>.redb
# мы предполагаем, что все файлы .redb, кроме index.redb, являются файлами базы данных кошелька.
# для установок после 0.18.2 будет безвредно создан файл AT_LEAST_0-18-2

if [[ ! -f "${APP_DATA_DIR}/AT_LEAST_0-18-2" ]]; then
    echo "AT_LEAST_0-18-2 not found, proceeding with wallet database migration if necessary..."
    # объявить сетевые каталоги биткойнов
    declare -a dirs=("" "/testnet3" "/regtest" "/signet")
    for dir in "${dirs[@]}"; do
        dir_path="${ORDINALS_DATA_DIR}${dir}"
        echo "Checking directory: ${dir_path}"
        if [[ -d "${dir_path}" ]]; then
            echo "${dir_path} exists."
            files_to_move=()  # an array to store wallet database files to migrate

            # Перебрать файлы .redb, которые не являются index.redb.
            for file in "${dir_path}"/*.redb; do
                if [[ -f "${file}" && "$(basename "${file}")" != "index.redb" ]]; then
                    files_to_move+=("${file}")
                    echo "Adding ${file} to move list."
                fi
            done

            # Мы создаем каталог кошельков только в том случае, если есть файлы для перемещения. Это имитирует поведение ord 0.18.2, который создает каталог кошельков только при создании базы данных кошельков.
            if [[ ${#files_to_move[@]} -gt 0 ]]; then 
                mkdir -p "${dir_path}/wallets"
                echo "Creating wallets directory in ${dir_path}/wallets"
                for file in "${files_to_move[@]}"; do
                    echo "Moving ${file} to ${dir_path}/wallets/"
                    mv "${file}" "${dir_path}/wallets/"
                done
            else
                echo "No wallet files to move in ${dir_path}."
            fi
        else
            echo "${dir_path} does not exist, skipping."
        fi
    done
    touch "${APP_DATA_DIR}/AT_LEAST_0-18-2"
    echo "Wallet database migration complete, flag file created."
else
    echo "Migration flag file already exists, skipping wallet database migration."
fi

