#!/bin/bash

# Безопасный скрипт для применения baseline миграции к существующим БД
# Включает создание backup, проверки и применение baseline

set -e

# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Получаем переменные окружения
DB_HOST=${DB_HOST:-localhost}
DB_PORT=${DB_PORT:-5432}
DB_USER=${DB_USER:-playeng}
DB_PASSWORD=${DB_PASSWORD:-playeng}
DB_NAME=${DB_NAME:-playeng}

MIGRATIONS_PATH="play-life-backend/migrations"
BACKUP_DIR="../database-dumps"

echo "=== Применение baseline миграции ==="
echo ""

# Проверяем наличие необходимых инструментов
if ! command -v migrate &> /dev/null; then
    echo -e "${RED}Ошибка: migrate не найден. Установите golang-migrate:${NC}"
    echo "  brew install golang-migrate"
    echo "  или"
    echo "  go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest"
    exit 1
fi

if ! command -v pg_dump &> /dev/null; then
    echo -e "${RED}Ошибка: pg_dump не найден. Установите PostgreSQL client tools.${NC}"
    exit 1
fi

# Проверяем наличие директории миграций
if [ ! -d "$MIGRATIONS_PATH" ]; then
    echo -e "${RED}Ошибка: Директория миграций не найдена: $MIGRATIONS_PATH${NC}"
    exit 1
fi

# Проверяем наличие baseline миграции
if [ ! -f "$MIGRATIONS_PATH/000001_baseline.up.sql" ]; then
    echo -e "${RED}Ошибка: Baseline миграция не найдена: $MIGRATIONS_PATH/000001_baseline.up.sql${NC}"
    exit 1
fi

echo "Параметры подключения:"
echo "  Host: $DB_HOST"
echo "  Port: $DB_PORT"
echo "  User: $DB_USER"
echo "  Database: $DB_NAME"
echo ""

# Проверяем подключение к БД
echo "1. Проверка подключения к БД..."
PGPASSWORD=$DB_PASSWORD psql \
    -h $DB_HOST \
    -p $DB_PORT \
    -U $DB_USER \
    -d $DB_NAME \
    -c "SELECT 1;" > /dev/null 2>&1

if [ $? -ne 0 ]; then
    echo -e "${RED}Ошибка: Не удалось подключиться к БД${NC}"
    exit 1
fi

echo -e "${GREEN}✓ Подключение успешно${NC}"
echo ""

# Проверяем текущую версию миграции
echo "2. Проверка текущей версии миграции..."
DATABASE_URL="postgres://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME?sslmode=disable"

CURRENT_VERSION=$(migrate -path "$MIGRATIONS_PATH" -database "$DATABASE_URL" version 2>&1 || echo "none")

if echo "$CURRENT_VERSION" | grep -q "dirty"; then
    echo -e "${YELLOW}⚠ База данных находится в состоянии 'dirty'${NC}"
    echo "   Это нормально для baseline - будет исправлено"
elif echo "$CURRENT_VERSION" | grep -q "^[0-9]"; then
    VERSION_NUM=$(echo "$CURRENT_VERSION" | grep -oE "^[0-9]+" || echo "0")
    if [ "$VERSION_NUM" -ge 1 ]; then
        echo -e "${GREEN}✓ Версия миграции уже установлена: $VERSION_NUM${NC}"
        echo "   Baseline уже применен, дальнейшие действия не требуются"
        exit 0
    fi
fi

echo "   Текущая версия: $CURRENT_VERSION"
echo ""

# Создаем backup
echo "3. Создание backup БД..."
mkdir -p "$BACKUP_DIR"
BACKUP_FILE="$BACKUP_DIR/baseline_backup_$(date +%Y%m%d_%H%M%S).sql.gz"

PGPASSWORD=$DB_PASSWORD pg_dump \
    -h $DB_HOST \
    -p $DB_PORT \
    -U $DB_USER \
    -d $DB_NAME \
    | gzip > "$BACKUP_FILE"

if [ $? -ne 0 ]; then
    echo -e "${RED}Ошибка: Не удалось создать backup${NC}"
    exit 1
fi

BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
echo -e "${GREEN}✓ Backup создан: $BACKUP_FILE (размер: $BACKUP_SIZE)${NC}"
echo ""

# Подтверждение
echo "4. Подтверждение применения baseline..."
echo ""
echo -e "${YELLOW}ВНИМАНИЕ:${NC}"
echo "   Будет установлена версия миграции в 1 (baseline)"
echo "   Сама миграция НЕ будет применена (схема уже существует)"
echo "   Backup сохранен в: $BACKUP_FILE"
echo ""
read -p "Продолжить? (yes/no): " CONFIRM

if [ "$CONFIRM" != "yes" ]; then
    echo "Отменено пользователем"
    exit 0
fi

# Применяем baseline (force 1)
echo ""
echo "5. Установка версии миграции в 1 (baseline)..."
migrate -path "$MIGRATIONS_PATH" \
        -database "$DATABASE_URL" \
        force 1

if [ $? -ne 0 ]; then
    echo -e "${RED}Ошибка: Не удалось установить версию миграции${NC}"
    echo "   Backup доступен в: $BACKUP_FILE"
    exit 1
fi

echo -e "${GREEN}✓ Версия миграции установлена${NC}"
echo ""

# Проверяем результат
echo "6. Проверка результата..."
FINAL_VERSION=$(migrate -path "$MIGRATIONS_PATH" -database "$DATABASE_URL" version 2>&1)
echo "   Версия миграции: $FINAL_VERSION"

if echo "$FINAL_VERSION" | grep -qE "^1"; then
    echo -e "${GREEN}✓ Baseline успешно применен!${NC}"
else
    echo -e "${YELLOW}⚠ Версия миграции: $FINAL_VERSION${NC}"
    echo "   Это может быть нормально, если база в состоянии 'dirty'"
fi

echo ""
echo "=== Готово ==="
echo ""
echo "Backup сохранен в: $BACKUP_FILE"
echo "Версия миграции установлена в: 1 (baseline)"
echo ""
echo "Теперь приложение будет автоматически применять новые миграции при запуске."
