#!/usr/bin/env bash
# Этот сценарий обрабатывает миграцию версий Jellyfin, чтобы обеспечить безопасное обновление через необходимые промежуточные версии.

set -euo pipefail

APP_DIR="$(readlink -f $(dirname "${BASH_SOURCE[0]}")/..)"
APP_DATA_DIR="${APP_DIR}/data"
APP_COMPOSE_FILE="${APP_DIR}/docker-compose.yml"
JELLYFIN_SYSTEM_FILE="${APP_DATA_DIR}/config/system.xml"
JELLYFIN_UPDATE_FLAG_FILE="${APP_DATA_DIR}/POST_1_10_VERSION"
MIGRATION_IN_PROGRESS_FILE="${APP_DATA_DIR}/MIGRATION_IN_PROGRESS"
MIGRATION_FIX_FLAG="${APP_DATA_DIR}/MIGRATION_20250618_FIXED"

# Если файлы базы данных еще не существуют
# Тогда скорее всего это новая установка
# Создайте файл флага, чтобы указать, что это версия 1.10+.
if [[ ! -f "${JELLYFIN_SYSTEM_FILE}" ]]; then
    touch "${JELLYFIN_UPDATE_FLAG_FILE}"
    touch "${MIGRATION_FIX_FLAG}"
fi

# Выйти, если файл флага существует
if [[ -f "${JELLYFIN_UPDATE_FLAG_FILE}" ]]; then
    echo "Jellyfin update flag file already exists at ${JELLYFIN_UPDATE_FLAG_FILE}. Skipping migration steps."
    exit 0
fi

# Проверьте, выполняется ли уже миграция, чтобы предотвратить бесконечные циклы.
if [[ -f "${MIGRATION_IN_PROGRESS_FILE}" ]]; then
    echo "Migration already in progress, exiting to prevent loops"
    exit 0
fi

# Отметить миграцию как выполняемую
touch "${MIGRATION_IN_PROGRESS_FILE}"

# Функция очистки ловушки
cleanup() {
    local exit_code=$?
    if [[ $exit_code -ne 0 ]]; then
        echo "Migration failed, cleaning up..."
        # Восстановить исходный файл компоновки, если у нас есть исходное изображение.
        if [[ -n "${original_server_image:-}" ]]; then
            yq -i ".services.server.image = \"${original_server_image}\"" "${APP_COMPOSE_FILE}" 2>/dev/null || true
        fi
    fi
    rm -f "${MIGRATION_IN_PROGRESS_FILE}"
}
trap cleanup EXIT

# Если файл флага не существует, сначала обновите его до версии 1.10.7, а затем перейдите к последней версии.
echo "No POST_1_10_VERSION flag found - performing update to v1.10.7 and then to latest version"

# Образы Docker для промежуточного шага v1.10.7
INTERMEDIATE_SERVER_IMAGE="linuxserver/jellyfin:10.10.7@sha256:01c9d2311eb7710867fb3a8c2718068a276cff468a71d2a2dc58a0f5165ad0d2"

# Получить текущие изображения с docker-compose.yml
get_current_images_from_compose() {
    local server_image=$(yq '.services.server.image' "${APP_COMPOSE_FILE}" 2>/dev/null || echo "")
    echo "${server_image}"
}

# Обновить файл компоновки новыми изображениями.
update_compose_images() {
    local server_image="${1}"
    
    yq -i ".services.server.image = \"${server_image}\"" "${APP_COMPOSE_FILE}"
}

# Сохраните исходное изображение для последнего шага.
original_server_image=$(get_current_images_from_compose)

echo "Step 1: Updating to v1.10.7 for safe migration"
update_compose_images "${INTERMEDIATE_SERVER_IMAGE}"

# Начните с версии 1.10.7
echo "Starting Jellyfin v1.10.7..."
"${DFWEBOS_ROOT}/scripts/app" start jellyfin

# Дождитесь завершения запуска и миграции.
echo "Waiting for v1.10.7 to complete startup and migrations..."

# Конечная точка опроса работоспособности с тайм-аутом
MAX_WAIT=300
POLL_INTERVAL=5
elapsed=0

while [[ $elapsed -lt $MAX_WAIT ]]; do
    if curl -sf "http://localhost:8096/health" > /dev/null 2>&1; then
        echo "Jellyfin v1.10.7 is healthy after ${elapsed}s"
        # Дайте дополнительное время для завершения оставшихся миграций.
        sleep 10
        break
    fi
    sleep $POLL_INTERVAL
    elapsed=$((elapsed + POLL_INTERVAL))
done

if [[ $elapsed -ge $MAX_WAIT ]]; then
    echo "Warning: Jellyfin health check timed out after ${MAX_WAIT}s, proceeding anyway"
fi

# Остановить приложение
echo "Stopping Jellyfin v1.10.7..."
"${DFWEBOS_ROOT}/scripts/app" stop jellyfin

# Примените исправление таблицы UserDatas к library.db BEFORE. Запускается версия 10.11.5.
# При миграции MigrateLibraryDb в версии 10.11.5 library.db будет переименован в library.db.old.
# Тогда MigrateLibraryUserData попытается прочитать UserDatas из library.db.old.
# Поэтому мы добавляем таблицу в library.db сейчас, прежде чем она будет переименована.
LIBRARY_DB="${APP_DATA_DIR}/config/data/data/library.db"
if [[ -f "${LIBRARY_DB}" && ! -f "${MIGRATION_FIX_FLAG}" ]]; then
    echo "Applying UserDatas table fix to library.db (before 10.11.5 renames it)..."
    
    if python3 -c "
import sqlite3
conn = sqlite3.connect('${LIBRARY_DB}')
cursor = conn.cursor()
cursor.execute('''
    CREATE TABLE IF NOT EXISTS UserDatas (
        key TEXT NOT NULL,
        userId TEXT NOT NULL,
        rating REAL,
        played INTEGER NOT NULL,
        playCount INTEGER NOT NULL,
        isFavorite INTEGER NOT NULL,
        playbackPositionTicks INTEGER NOT NULL,
        lastPlayedDate TEXT,
        AudioStreamIndex INTEGER,
        SubtitleStreamIndex INTEGER,
        PRIMARY KEY (key, userId)
    )
''')
conn.commit()
conn.close()
"; then
        echo "UserDatas table fix applied successfully"
        touch "${MIGRATION_FIX_FLAG}"
    else
        echo "Failed to apply UserDatas table fix"
        exit 1
    fi
fi

echo "Step 2: Updating to latest version"
update_compose_images "${original_server_image}"

# Создайте файл флага, чтобы предотвратить повторный запуск этой миграции.
touch "${JELLYFIN_UPDATE_FLAG_FILE}"

echo "Migration completed: v1.10.7 -> latest version"
echo "Created ${JELLYFIN_UPDATE_FLAG_FILE} flag file"
