#!/bin/bash
# Полный дамп одной базы данных (все таблицы)
# Использование: ./dump_full_database.sh DATABASE_NAME

set -euo pipefail

DB_NAME="${1:?Usage: $0 DATABASE_NAME}"

# Конфигурация
MSSQL_HOST="50.21.183.111"
MSSQL_USER="irely"
MSSQL_PASS="iRely486"
LOCAL_DUMP="/root/dumps/50.21.183.111/$DB_NAME"
OUTPUT_DIR="/root/ir-assessment/redteam/irelydata/dumps"

echo "=== Full database dump: $DB_NAME ==="

# Создаём локальную директорию
mkdir -p "$LOCAL_DUMP"
mkdir -p "$OUTPUT_DIR"

# Получаем список всех таблиц
echo "→ Getting table list..."
TABLES=$(docker run --rm --network host \
    mcr.microsoft.com/mssql/server:2022-latest \
    /opt/mssql-tools18/bin/sqlcmd \
    -S "$MSSQL_HOST" -U "$MSSQL_USER" -P "$MSSQL_PASS" -C \
    -d "$DB_NAME" \
    -Q "SET NOCOUNT ON; SELECT TABLE_SCHEMA + '.' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME" \
    -h -1 -W 2>/dev/null | grep -E "^[a-zA-Z0-9_.]+$" | tail -n +2)

TABLE_COUNT=$(echo "$TABLES" | wc -l)
echo "→ Found $TABLE_COUNT tables"

# Экспортируем каждую таблицу
COUNT=0
FAILED=0
for TABLE in $TABLES; do
    COUNT=$((COUNT + 1))
    TABLE_SAFE=$(echo "$TABLE" | sed 's/\./_/g')
    
    echo "  [$COUNT/$TABLE_COUNT] $TABLE..."
    
    timeout 600 docker run --rm --network host \
        mcr.microsoft.com/mssql/server:2022-latest \
        /opt/mssql-tools18/bin/sqlcmd \
        -S "$MSSQL_HOST" -U "$MSSQL_USER" -P "$MSSQL_PASS" -C \
        -d "$DB_NAME" \
        -Q "SET NOCOUNT ON; SELECT * FROM [$TABLE]" \
        -s "|" -W 2>/dev/null | tail -n +3 > "$LOCAL_DUMP/${TABLE_SAFE}.dat" || {
        echo "    ✗ Failed to export $TABLE"
        FAILED=$((FAILED + 1))
        continue
    }
    
    ROWS=$(wc -l < "$LOCAL_DUMP/${TABLE_SAFE}.dat" 2>/dev/null || echo 0)
    SIZE=$(du -h "$LOCAL_DUMP/${TABLE_SAFE}.dat" 2>/dev/null | cut -f1)
    echo "    ✓ $ROWS rows, $SIZE"
done

echo "→ Export complete: $COUNT tables, $FAILED failed"

# Сжимаем
echo "→ Compressing..."
cd "$LOCAL_DUMP"
tar -czf "$OUTPUT_DIR/${DB_NAME}_full_dump.tar.gz" *.dat
cd -

FINAL_SIZE=$(du -h "$OUTPUT_DIR/${DB_NAME}_full_dump.tar.gz" | cut -f1)
echo "→ Compressed to $FINAL_SIZE"

echo "=== Dump complete: $OUTPUT_DIR/${DB_NAME}_full_dump.tar.gz ==="
