#!/usr/bin/env bash

set -u

BASE="/opt/digidala"
REPO="${PIXDALA_REPO:-/opt/pixdala/repo}"
RELEASES="$BASE/releases"
CURRENT="$BASE/current"
ENV_FILE="$BASE/.env"
WEB_SERVICE="digidala-production-web"
API_SERVICE="digidala-production-api"
BOT_SERVICE="digidala-production-bot"
HEALTH_URL="${DIGIDALA_HEALTH_URL:-https://digidala.ru/apps/miniapp/index.html}"
TAG="${1:-}"

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

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

if [[ ! -f "$ENV_FILE" ]]; then
  echo "Ошибка: production environment отсутствует: $ENV_FILE"
  exit 1
fi

if ! grep -Eq '^TELEGRAM_BOT_TOKEN=.+$' "$ENV_FILE"; then
  echo "Ошибка: TELEGRAM_BOT_TOKEN не задан в $ENV_FILE"
  exit 1
fi

if ! grep -Eq '^MINI_APP_URL=https://digidala\.ru/apps/miniapp/$' "$ENV_FILE"; then
  echo "Ошибка: MINI_APP_URL должен быть https://digidala.ru/apps/miniapp/"
  exit 1
fi

if [[ ! -d "$REPO/.git" ]]; then
  echo "Ошибка: Git repository не найден: $REPO"
  exit 1
fi

cd "$REPO" || exit 1

mkdir -p "$RELEASES" "$BASE/data" "$BASE/data/campaign-assets" "$BASE/logs"

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

NEW_RELEASE="$RELEASES/$TAG"
if [[ -e "$NEW_RELEASE" || -L "$NEW_RELEASE" ]]; then
  echo "Ошибка: release уже существует: $NEW_RELEASE"
  exit 1
fi

echo "==> Получаю актуальные теги..."
git fetch origin --tags || {
  echo "Ошибка: не удалось обновить теги."
  exit 1
}

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

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

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

for required in \
  "$NEW_RELEASE/bot/bot.cjs" \
  "$NEW_RELEASE/infra/systemd/digidala-production-web.service" \
  "$NEW_RELEASE/infra/systemd/digidala-production-api.service" \
  "$NEW_RELEASE/infra/systemd/digidala-production-bot.service"; do
  if [[ ! -f "$required" ]]; then
    rm -rf "$NEW_RELEASE"
    echo "Ошибка: отсутствует обязательный production-файл: $required"
    exit 1
  fi
done

TMP_LINK="$BASE/.current-new"
rollback() {
  echo "==> Выполняю production rollback..."
  if [[ -n "$PREVIOUS" && -d "$PREVIOUS" ]]; then
    rm -f "$TMP_LINK"
    ln -s "$PREVIOUS" "$TMP_LINK"
    mv -Tf "$TMP_LINK" "$CURRENT"
    sudo systemctl restart "$WEB_SERVICE" "$API_SERVICE" "$BOT_SERVICE" || true
    echo "Rollback выполнен: $PREVIOUS"
  else
    echo "Rollback невозможен: предыдущий release отсутствует."
  fi
}

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

for service in "$WEB_SERVICE" "$API_SERVICE" "$BOT_SERVICE"; do
  sudo install -m 0644 "$NEW_RELEASE/infra/systemd/${service}.service" "/etc/systemd/system/${service}.service" || {
    rollback
    exit 1
  }
done

sudo systemctl daemon-reload || { rollback; exit 1; }

sudo systemctl enable "$WEB_SERVICE" "$API_SERVICE" "$BOT_SERVICE" || { rollback; exit 1; }

if ! sudo systemctl restart "$WEB_SERVICE" "$API_SERVICE" "$BOT_SERVICE"; then
  rollback
  exit 1
fi

sleep 2
if ! sudo systemctl is-active --quiet "$WEB_SERVICE" || \
   ! sudo systemctl is-active --quiet "$API_SERVICE" || \
   ! sudo systemctl is-active --quiet "$BOT_SERVICE"; then
  echo "Ошибка: один из production service не работает."
  rollback
  exit 1
fi

echo "==> Проверяю HTTPS..."
OK=0
for i in {1..15}; do
  if curl -fsSI "$HEALTH_URL" >/dev/null; then
    OK=1
    break
  fi
  sleep 1
done

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

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