#!/bin/bash

# Скрипт для создания дампа базы данных
# Использование: 
#   ./dump-db.sh [имя_дампа]                    # Дамп из .env.prod
#   ./dump-db.sh --env-file .env [имя]          # Дамп из указанного файла
#   ./dump-db.sh production-backup              # Именованный дамп из .env.prod

set -e

# Значения по умолчанию
DEFAULT_ENV_FILE=".env.prod"
ENV_FILE="$DEFAULT_ENV_FILE"
DUMP_NAME=""

# Парсим аргументы
while [[ $# -gt 0 ]]; do
    case $1 in
        --env-file)
            ENV_FILE="$2"
            shift 2
            ;;
        *)
            if [ -z "$DUMP_NAME" ]; then
                DUMP_NAME="$1"
            else
                echo "❌ Ошибка: Неизвестный аргумент: $1"
                echo "Использование: ./dump-db.sh [--env-file FILE] [имя_дампа]"
                exit 1
            fi
            shift
            ;;
    esac
done

# Загружаем переменные окружения из указанного файла
if [ -f "$ENV_FILE" ]; then
    export $(cat "$ENV_FILE" | grep -v '^#' | grep -v '^$' | xargs)
    echo "📋 Используется файл окружения: $ENV_FILE"
else
    echo "⚠️  Файл $ENV_FILE не найден, используются значения по умолчанию"
fi

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}

# Создаем директорию для дампов, если её нет
mkdir -p database-dumps

# Генерируем имя файла с датой и временем, если не указано
if [ -z "$DUMP_NAME" ]; then
    DUMP_NAME="dump_$(date +%Y%m%d_%H%M%S).sql"
else
    DUMP_NAME="$DUMP_NAME.sql"
fi

DUMP_PATH="database-dumps/$DUMP_NAME"

echo "🗄️  Создание дампа базы данных..."
echo "   База: $DB_NAME"
echo "   Хост: $DB_HOST:$DB_PORT"
echo "   Пользователь: $DB_USER"
echo "   Файл: $DUMP_PATH"

# Создаем дамп через docker-compose, если контейнер запущен И хост локальный
if [ "$DB_HOST" = "localhost" ] || [ "$DB_HOST" = "127.0.0.1" ] || [ -z "$DB_HOST" ]; then
    if docker-compose ps db 2>/dev/null | grep -q "Up"; then
        echo "   Используется docker-compose..."
        docker-compose exec -T db pg_dump -U "$DB_USER" -d "$DB_NAME" > "$DUMP_PATH"
    elif command -v pg_dump &> /dev/null; then
        # Или напрямую через pg_dump, если БД доступна локально
        echo "   Используется локальный pg_dump..."
        PGPASSWORD="$DB_PASSWORD" pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" > "$DUMP_PATH"
    elif command -v docker &> /dev/null; then
        # Используем Docker образ postgres для создания дампа
        echo "   Используется Docker (postgres:latest)..."
        docker run --rm -i --network host \
            -e PGPASSWORD="$DB_PASSWORD" \
            postgres:latest \
            pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" > "$DUMP_PATH"
    else
        echo "❌ Ошибка: pg_dump не найден, docker-compose не запущен и Docker недоступен"
        echo "   Установите PostgreSQL клиент или Docker"
        exit 1
    fi
else
    # Для удаленных хостов используем pg_dump или Docker
    if command -v pg_dump &> /dev/null; then
        echo "   Используется локальный pg_dump..."
        PGPASSWORD="$DB_PASSWORD" pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" > "$DUMP_PATH"
    elif command -v docker &> /dev/null; then
        # Используем Docker образ postgres для создания дампа
        # Используем latest для совместимости с разными версиями сервера
        echo "   Используется Docker (postgres:latest)..."
        # Используем --network host для доступа к удаленным хостам
        docker run --rm -i --network host \
            -e PGPASSWORD="$DB_PASSWORD" \
            postgres:latest \
            pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" > "$DUMP_PATH"
    else
        echo "❌ Ошибка: pg_dump не найден и Docker недоступен"
        echo "   Установите PostgreSQL клиент или Docker"
        exit 1
    fi
fi

# Сжимаем дамп
echo "   Сжатие дампа..."
gzip -f "$DUMP_PATH"
DUMP_PATH="${DUMP_PATH}.gz"

echo "✅ Дамп успешно создан: $DUMP_PATH"
echo "   Размер: $(du -h "$DUMP_PATH" | cut -f1)"

# Ограничиваем количество дампов (максимум 10)
MAX_DUMPS=10
DUMP_COUNT=$(ls -1 database-dumps/*.sql.gz 2>/dev/null | wc -l | tr -d ' ')

if [ "$DUMP_COUNT" -gt "$MAX_DUMPS" ]; then
    echo ""
    echo "🧹 Очистка старых дампов (максимум $MAX_DUMPS)..."
    # Сортируем по дате модификации (новые первыми) и удаляем самые старые
    OLD_DUMPS=$(ls -1t database-dumps/*.sql.gz 2>/dev/null | tail -n +$((MAX_DUMPS + 1)))
    if [ -n "$OLD_DUMPS" ]; then
        REMOVED_COUNT=0
        for old_dump in $OLD_DUMPS; do
            rm -f "$old_dump"
            REMOVED_COUNT=$((REMOVED_COUNT + 1))
            echo "   Удален: $(basename "$old_dump")"
        done
        echo "   Удалено дампов: $REMOVED_COUNT"
        echo "   Осталось дампов: $MAX_DUMPS"
    fi
fi

