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

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"
IMMICH_PG_VERSION_FILE="${APP_DATA_DIR}/postgres/PG_VERSION"
IMMICH_UPDATE_FLAG_FILE="${APP_DATA_DIR}/POST_1_136_0_VERSION"
MIGRATION_IN_PROGRESS_FILE="${APP_DATA_DIR}/MIGRATION_IN_PROGRESS"

# Создайте каталог кеша модели, если он не существует.
MODEL_CACHE_DIR="${APP_DATA_DIR}/model-cache"
[ ! -d "${MODEL_CACHE_DIR}" ] && mkdir -p "${MODEL_CACHE_DIR}" && chown 1000:1000 "${MODEL_CACHE_DIR}"

# удалить каталог tsdata, если он существует
TYPESENSE_DIR="${APP_DATA_DIR}/tsdata"
[ -d "${TYPESENSE_DIR}" ] && rm -rf "${TYPESENSE_DIR}"

# удалите старый скрипт после обновления, если он существует
POST_UPDATE_SCRIPT="$(readlink -f $(dirname "${BASH_SOURCE[0]}"))/post-update"
[ -f "${POST_UPDATE_SCRIPT}" ] && rm -f "${POST_UPDATE_SCRIPT}"

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

# Выйти, если файл флага существует
if [[ -f "${IMMICH_UPDATE_FLAG_FILE}" ]]; then
    echo "Immich update flag file already exists at ${IMMICH_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}"

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

# Образы Docker для промежуточного шага v1.136.0
INTERMEDIATE_SERVER_IMAGE="ghcr.io/immich-app/immich-server:v1.136.0@sha256:8c9633b96ca5b748b10875a99c498ee6f1e5d7f7d1df2bf341909cacb88ad672"
INTERMEDIATE_ML_IMAGE="ghcr.io/immich-app/immich-machine-learning:v1.136.0@sha256:198d52734136fe9840866cc2f48a8141e0d002c2a25be7e35cd28ef7936b6c67"

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

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

# Сохраните исходные изображения для последнего шага.
original_images=$(get_current_images_from_compose)
original_server_image=$(echo "${original_images}" | cut -d'|' -f1)
original_ml_image=$(echo "${original_images}" | cut -d'|' -f2)

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

# Начните с версии 1.136.0
echo "Starting Immich v1.136.0..."
"${DFWEBOS_ROOT}/scripts/app" start immich

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

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

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

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

# Удалить файл выполнения миграции
rm -f "${MIGRATION_IN_PROGRESS_FILE}"

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