#!/bin/bash

# Скрипт для переноса зашифрованных данных между серверами
# Использование: ./migrate-encrypted-data.sh

# Конфигурация
SOURCE_HOST="localhost"  # Исходный сервер
TARGET_HOST="new-server.com"  # Целевой сервер
DB_NAME="dapp_db"
DB_USER="dapp_user"
DB_PASSWORD="dapp_password"
BACKUP_DIR="./migration_backups"

# Создаём папку для бэкапов
mkdir -p "$BACKUP_DIR"

echo "🔄 Перенос зашифрованных данных между серверами..."

# Проверяем наличие ключа шифрования
if [ ! -f "./ssl/keys/full_db_encryption.key" ]; then
    echo "❌ Ключ шифрования не найден: ./ssl/keys/full_db_encryption.key"
    exit 1
fi

# Функция для создания бэкапа с ключом
create_backup_with_key() {
    echo "📦 Создание бэкапа с ключом шифрования..."
    
    # Создаём бэкап базы данных
    BACKUP_FILE="$BACKUP_DIR/encrypted_backup_$(date +%Y%m%d_%H%M%S).sql"
    docker exec dapp-postgres pg_dump -U "$DB_USER" "$DB_NAME" > "$BACKUP_FILE"
    
    # Создаём архив с бэкапом и ключом
    ARCHIVE_FILE="$BACKUP_DIR/migration_package_$(date +%Y%m%d_%H%M%S).tar.gz"
    tar -czf "$ARCHIVE_FILE" \
        -C . "$BACKUP_FILE" \
        -C . ssl/keys/full_db_encryption.key \
        -C . encrypt-all-tables.sh \
        -C . decrypt-all-tables.sh \
        -C . backend/services/encryptedDataService.js
    
    echo "✅ Бэкап создан: $ARCHIVE_FILE"
    echo "📋 Содержимое архива:"
    tar -tzf "$ARCHIVE_FILE"
}

# Функция для восстановления на целевом сервере
restore_on_target() {
    echo "🔄 Восстановление на целевом сервере..."
    
    # Распаковываем архив
    tar -xzf "$ARCHIVE_FILE" -C .
    
    # Восстанавливаем ключ шифрования
    mkdir -p ./ssl/keys
    cp ssl/keys/full_db_encryption.key ./ssl/keys/
    chmod 600 ./ssl/keys/full_db_encryption.key
    
    # Восстанавливаем базу данных
    docker exec dapp-postgres psql -U "$DB_USER" "$DB_NAME" < "$BACKUP_FILE"
    
    echo "✅ Данные восстановлены на целевом сервере"
}

# Функция для переноса через SSH
migrate_via_ssh() {
    echo "🌐 Перенос через SSH..."
    
    # Создаём бэкап
    create_backup_with_key
    
    # Отправляем архив на целевой сервер
    scp "$ARCHIVE_FILE" user@$TARGET_HOST:/tmp/
    
    # Выполняем восстановление на целевом сервере
    ssh user@$TARGET_HOST << 'EOF'
        cd /tmp
        tar -xzf migration_package_*.tar.gz -C /path/to/app/
        cd /path/to/app/
        chmod 600 ssl/keys/full_db_encryption.key
        docker exec dapp-postgres psql -U dapp_user dapp_db < encrypted_backup_*.sql
        echo "✅ Миграция завершена"
EOF
    
    echo "✅ Перенос через SSH завершён"
}

# Функция для переноса через S3/облачное хранилище
migrate_via_cloud() {
    echo "☁️ Перенос через облачное хранилище..."
    
    # Создаём бэкап
    create_backup_with_key
    
    # Загружаем в S3 (пример)
    aws s3 cp "$ARCHIVE_FILE" s3://your-bucket/migrations/
    
    echo "📤 Архив загружен в облачное хранилище"
    echo "📥 Для восстановления скачайте архив и выполните:"
    echo "   tar -xzf migration_package_*.tar.gz"
    echo "   docker exec dapp-postgres psql -U dapp_user dapp_db < encrypted_backup_*.sql"
}

# Функция для переноса через USB/локальный носитель
migrate_via_local() {
    echo "💾 Перенос через локальный носитель..."
    
    # Создаём бэкап
    create_backup_with_key
    
    echo "📁 Архив создан: $ARCHIVE_FILE"
    echo "💿 Скопируйте файл на USB-накопитель или другой носитель"
    echo "🔄 На целевом сервере выполните:"
    echo "   tar -xzf migration_package_*.tar.gz"
    echo "   docker exec dapp-postgres psql -U dapp_user dapp_db < encrypted_backup_*.sql"
}

# Функция для проверки целостности
verify_migration() {
    echo "🔍 Проверка целостности миграции..."
    
    # Проверяем наличие ключа
    if [ ! -f "./ssl/keys/full_db_encryption.key" ]; then
        echo "❌ Ключ шифрования не найден"
        return 1
    fi
    
    # Проверяем подключение к БД
    if ! docker exec dapp-postgres pg_isready -U "$DB_USER" -d "$DB_NAME" > /dev/null 2>&1; then
        echo "❌ Не удалось подключиться к базе данных"
        return 1
    fi
    
    # Проверяем зашифрованные данные
    docker exec dapp-postgres psql -U "$DB_USER" -d "$DB_NAME" -c "
    SELECT 
        table_name,
        COUNT(*) as encrypted_columns
    FROM information_schema.columns 
    WHERE table_schema = 'public'
    AND column_name LIKE '%_encrypted'
    GROUP BY table_name
    ORDER BY table_name;"
    
    echo "✅ Проверка целостности завершена"
}

# Главное меню
echo "🎯 Выберите способ переноса:"
echo "1) Создать бэкап с ключом"
echo "2) Перенос через SSH"
echo "3) Перенос через облачное хранилище"
echo "4) Перенос через локальный носитель"
echo "5) Проверить целостность"
echo "6) Выход"

read -p "Выберите опцию (1-6): " choice

case $choice in
    1)
        create_backup_with_key
        ;;
    2)
        read -p "Введите IP целевого сервера: " TARGET_HOST
        migrate_via_ssh
        ;;
    3)
        migrate_via_cloud
        ;;
    4)
        migrate_via_local
        ;;
    5)
        verify_migration
        ;;
    6)
        echo "👋 Выход"
        exit 0
        ;;
    *)
        echo "❌ Неверный выбор"
        exit 1
        ;;
esac

echo ""
echo "🎯 Инструкция по восстановлению на целевом сервере:"
echo "1. Скопируйте архив на целевой сервер"
echo "2. Распакуйте архив: tar -xzf migration_package_*.tar.gz"
echo "3. Восстановите ключ: chmod 600 ssl/keys/full_db_encryption.key"
echo "4. Восстановите БД: docker exec dapp-postgres psql -U dapp_user dapp_db < encrypted_backup_*.sql"
echo "5. Проверьте целостность: ./verify-migration.sh" 