#!/usr/bin/env bash

set -u

BASE="/opt/pixdala"
REPO="$BASE/repo"
RELEASES="$BASE/releases"
CURRENT="$BASE/current"
WEB_SERVICE="pixdala-test-web"
API_SERVICE="pixdala-test-api"
BOT_SERVICE="pixdala-bot"
OLD_BOT_SERVICE="pixdala-test-bot"
HEALTH_URL="https://im-test.bktis.ru/apps/miniapp/index.html"

TAG="${1:-}"

if [[ -z "$TAG" ]]; then
  echo "Использование: $0 <tag>"
  echo "Пример: $0 v0.1.4"
  exit 1
fi

if [[ ! "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+([\-\.][0-9A-Za-z.-]+)?$ ]]; then
  echo "Ошибка: неверный формат версии: $TAG"
  exit 1
fi

cd "$REPO" || exit 1

echo "==> Получаю актуальные теги..."
if ! git fetch origin --tags; then
  echo "Предупреждение: не удалось обновить Git remote."
  echo "Продолжаю с тегами, уже доступными локально."
fi

echo "==> Проверяю тег $TAG..."
if ! git rev-parse --verify --quiet "$TAG^{commit}" >/dev/null; then
  echo "Ошибка: тег $TAG не найден."
  exit 1
fi

NEW_RELEASE="$RELEASES/$TAG"

if [[ -e "$NEW_RELEASE" || -L "$NEW_RELEASE" ]]; then
  echo "Ошибка: release уже существует: $NEW_RELEASE"
  echo "Это защита от случайного перезаписывания."
  exit 1
fi

PREVIOUS=""
if [[ -e "$CURRENT" || -L "$CURRENT" ]]; then
  PREVIOUS="$(readlink -f "$CURRENT")"
fi

echo "==> Создаю release $TAG..."
mkdir -p "$NEW_RELEASE"

if ! git archive "$TAG" | tar -x -C "$NEW_RELEASE"; then
  echo "Ошибка создания release."
  rm -rf "$NEW_RELEASE"
  exit 1
fi

echo "==> Проверяю release..."
if ! npm run check --prefix "$NEW_RELEASE"; then
  echo "Ошибка: проверки release не прошли."
  rm -rf "$NEW_RELEASE"
  exit 1
fi

if [[ ! -f "$NEW_RELEASE/bot/bot.cjs" ]]; then
  echo "Ошибка: в release отсутствует bot/bot.cjs."
  rm -rf "$NEW_RELEASE"
  exit 1
fi

if [[ ! -f "$NEW_RELEASE/infra/systemd/pixdala-bot.service" ]]; then
  echo "Ошибка: в release отсутствует infra/systemd/pixdala-bot.service."
  rm -rf "$NEW_RELEASE"
  exit 1
fi

TMP_LINK="$BASE/.current-new"

rollback() {
  if [[ -n "$PREVIOUS" ]]; then
    echo "==> Выполняю rollback к предыдущему release..."

    # Never leave the new bot service running during rollback.
    sudo systemctl disable --now "$BOT_SERVICE" >/dev/null 2>&1 || true

    rm -f "$TMP_LINK"
    ln -s "$PREVIOUS" "$TMP_LINK"
    mv -Tf "$TMP_LINK" "$CURRENT"

    # Restore the previous bot unit. For the first migration release, the
    # previous release has no Git-managed bot unit, so fall back to the
    # preserved legacy unit created during the migration bootstrap.
    if [[ -f "$PREVIOUS/infra/systemd/pixdala-bot.service" ]]; then
      sudo install -m 0644 \
        "$PREVIOUS/infra/systemd/pixdala-bot.service" \
        "/etc/systemd/system/pixdala-bot.service"

      sudo systemctl daemon-reload || true
      sudo systemctl enable --now "$BOT_SERVICE" || true

    elif [[ -f "$BASE/bot-test/pixdala-test-bot.service.alpha35-backup" ]]; then
      sudo install -m 0644 \
        "$BASE/bot-test/pixdala-test-bot.service.alpha35-backup" \
        "/etc/systemd/system/pixdala-test-bot.service"

      sudo systemctl daemon-reload || true
      sudo systemctl enable --now "$OLD_BOT_SERVICE" || true
    fi

    sudo systemctl restart "$WEB_SERVICE" "$API_SERVICE" || true

    echo "Rollback выполнен:"
    echo "$PREVIOUS"
  fi
}

echo "==> Переключаю current..."
rm -f "$TMP_LINK"
ln -s "$NEW_RELEASE" "$TMP_LINK"
mv -Tf "$TMP_LINK" "$CURRENT"

# The first migration release must stop and disable the legacy bot service
# before the renamed service is started, so both services never use the same
# Telegram bot token.
if sudo systemctl is-active --quiet "$OLD_BOT_SERVICE"; then
  echo "==> Останавливаю legacy bot service: $OLD_BOT_SERVICE..."
  if ! sudo systemctl disable --now "$OLD_BOT_SERVICE"; then
    echo "Ошибка: не удалось остановить legacy bot service."
    rollback
    exit 1
  fi
fi

# Keep the systemd unit synchronized with the release.
echo "==> Синхронизирую systemd unit бота..."
if ! sudo install -m 0644 \
  "$NEW_RELEASE/infra/systemd/pixdala-bot.service" \
  "/etc/systemd/system/pixdala-bot.service"; then
  echo "Ошибка: не удалось установить systemd unit бота."
  rollback
  exit 1
fi

if ! sudo systemctl daemon-reload; then
  echo "Ошибка: не удалось выполнить systemctl daemon-reload."
  rollback
  exit 1
fi

echo "==> Включаю $BOT_SERVICE..."
if ! sudo systemctl enable "$BOT_SERVICE"; then
  echo "Ошибка: не удалось включить $BOT_SERVICE."
  rollback
  exit 1
fi

echo "==> Перезапускаю $WEB_SERVICE, $API_SERVICE и $BOT_SERVICE..."
if ! sudo systemctl restart "$WEB_SERVICE" "$API_SERVICE" "$BOT_SERVICE"; then
  echo "Ошибка: systemd не смог перезапустить один из сервисов."
  rollback
  exit 1
fi

echo "==> Проверяю статус сервисов..."
if ! sudo systemctl is-active --quiet "$WEB_SERVICE" || \
   ! sudo systemctl is-active --quiet "$API_SERVICE" || \
   ! sudo systemctl is-active --quiet "$BOT_SERVICE"; then
  echo "Ошибка: web, API и/или bot service не работает."
  rollback
  exit 1
fi

echo "==> Проверяю HTTP..."
OK=0

for i in {1..10}; do
  if curl -fsSI "$HEALTH_URL" >/dev/null; then
    OK=1
    break
  fi
  sleep 1
done

if [[ "$OK" -ne 1 ]]; then
  echo "Ошибка: smoke test не пройден."
  rollback
  exit 1
fi

echo
echo "========================================"
echo " TEST DEPLOY УСПЕШНО ЗАВЕРШЁН"
echo " Версия: $TAG"
echo " Current: $(readlink -f "$CURRENT")"
echo "========================================"
