#!/bin/bash

# Скрипт для проверки полноты baseline миграции
# Сравнивает текущую схему БД с 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}

echo "=== Проверка полноты baseline миграции ==="
echo ""

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

# Создаем временную директорию
TMP_DIR=$(mktemp -d)
trap "rm -rf $TMP_DIR" EXIT

echo "1. Экспортируем текущую схему БД..."
PGPASSWORD=$DB_PASSWORD pg_dump \
    -h $DB_HOST \
    -p $DB_PORT \
    -U $DB_USER \
    -d $DB_NAME \
    --schema-only \
    --no-owner \
    --no-privileges \
    -f "$TMP_DIR/current_schema.sql"

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

echo -e "${GREEN}✓ Схема экспортирована${NC}"
echo ""

# Применяем baseline миграцию к временной БД для сравнения
echo "2. Создаем временную БД для проверки baseline..."
TEMP_DB_NAME="playeng_baseline_test_$$"
PGPASSWORD=$DB_PASSWORD psql \
    -h $DB_HOST \
    -p $DB_PORT \
    -U $DB_USER \
    -d postgres \
    -c "CREATE DATABASE $TEMP_DB_NAME;" > /dev/null 2>&1

if [ $? -ne 0 ]; then
    echo -e "${YELLOW}Предупреждение: Не удалось создать временную БД. Продолжаем без неё.${NC}"
    TEMP_DB_NAME=""
else
    echo -e "${GREEN}✓ Временная БД создана${NC}"
fi

# Очистка временной БД при выходе
if [ -n "$TEMP_DB_NAME" ]; then
    trap "PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d postgres -c 'DROP DATABASE IF EXISTS $TEMP_DB_NAME;' > /dev/null 2>&1; rm -rf $TMP_DIR" EXIT
fi

echo ""
echo "3. Анализ схемы..."

# Извлекаем только CREATE TABLE, CREATE INDEX, CREATE VIEW и т.д. из текущей схемы
grep -E "^(CREATE|ALTER|COMMENT)" "$TMP_DIR/current_schema.sql" | \
    sed 's/--.*$//' | \
    tr -d '\n' | \
    sed 's/;/;\n/g' | \
    sort > "$TMP_DIR/current_clean.sql"

# Извлекаем из baseline миграции
BASELINE_FILE="play-life-backend/migrations/000001_baseline.up.sql"
if [ ! -f "$BASELINE_FILE" ]; then
    echo -e "${RED}Ошибка: Baseline файл не найден: $BASELINE_FILE${NC}"
    exit 1
fi

grep -E "^(CREATE|ALTER|COMMENT)" "$BASELINE_FILE" | \
    sed 's/--.*$//' | \
    tr -d '\n' | \
    sed 's/;/;\n/g' | \
    sort > "$TMP_DIR/baseline_clean.sql"

echo ""
echo "4. Сравнение..."

# Сравниваем количество таблиц
CURRENT_TABLES=$(grep -c "CREATE TABLE" "$TMP_DIR/current_schema.sql" || echo "0")
BASELINE_TABLES=$(grep -c "CREATE TABLE" "$BASELINE_FILE" || echo "0")

echo "   Текущая БД: $CURRENT_TABLES таблиц"
echo "   Baseline:   $BASELINE_TABLES таблиц"

if [ "$CURRENT_TABLES" -ne "$BASELINE_TABLES" ]; then
    echo -e "${YELLOW}⚠ Количество таблиц не совпадает${NC}"
else
    echo -e "${GREEN}✓ Количество таблиц совпадает${NC}"
fi

# Сравниваем количество индексов
CURRENT_INDEXES=$(grep -c "CREATE.*INDEX" "$TMP_DIR/current_schema.sql" || echo "0")
BASELINE_INDEXES=$(grep -c "CREATE.*INDEX" "$BASELINE_FILE" || echo "0")

echo "   Текущая БД: $CURRENT_INDEXES индексов"
echo "   Baseline:   $BASELINE_INDEXES индексов"

if [ "$CURRENT_INDEXES" -ne "$BASELINE_INDEXES" ]; then
    echo -e "${YELLOW}⚠ Количество индексов не совпадает${NC}"
else
    echo -e "${GREEN}✓ Количество индексов совпадает${NC}"
fi

# Проверяем наличие materialized view
CURRENT_MV=$(grep -c "CREATE MATERIALIZED VIEW" "$TMP_DIR/current_schema.sql" || echo "0")
BASELINE_MV=$(grep -c "CREATE MATERIALIZED VIEW" "$BASELINE_FILE" || echo "0")

echo "   Текущая БД: $CURRENT_MV materialized views"
echo "   Baseline:   $BASELINE_MV materialized views"

if [ "$CURRENT_MV" -ne "$BASELINE_MV" ]; then
    echo -e "${YELLOW}⚠ Количество materialized views не совпадает${NC}"
else
    echo -e "${GREEN}✓ Количество materialized views совпадает${NC}"
fi

echo ""
echo "=== Проверка завершена ==="
echo ""
echo "Для детального сравнения выполните:"
echo "  diff $TMP_DIR/current_schema.sql $BASELINE_FILE"
