#!/bin/bash
#
# NordaBiz Disaster Recovery Restore Script
#
# Przywraca bazę danych PostgreSQL z backupu i restartuje aplikację.
#
# Użycie:
#   ./dr-restore.sh /path/to/backup.dump
#   ./dr-restore.sh /var/backups/nordabiz/daily/nordabiz_20260202.dump
#
# Wymagania:
#   - Uruchomienie jako root lub z sudo
#   - Backup w formacie pg_dump -Fc (custom format)
#
# Autor: NordaBiz Team
# Data: 2026-02-02

set -e

# Kolory dla output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Konfiguracja
DB_NAME="nordabiz"
DB_USER="nordabiz_app"
APP_SERVICE="nordabiznes"
HEALTH_URL="http://localhost:5000/health"
LOG_FILE="/var/log/nordabiznes/dr-restore.log"

# Funkcje pomocnicze
log() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

error() {
    echo -e "${RED}[ERROR]${NC} $1" >&2
    echo "[ERROR] $1" >> "$LOG_FILE"
    exit 1
}

warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
    echo "[WARN] $1" >> "$LOG_FILE"
}

# Sprawdzenie argumentów
if [ -z "$1" ]; then
    echo "Użycie: $0 <ścieżka_do_backupu>"
    echo ""
    echo "Przykłady:"
    echo "  $0 /var/backups/nordabiz/daily/nordabiz_20260202.dump"
    echo "  $0 /var/backups/nordabiz/hourly/nordabiz_20260202_14.dump"
    echo ""
    echo "Dostępne backupy:"
    echo "  Dzienne: ls /var/backups/nordabiz/daily/"
    echo "  Godzinowe: ls /var/backups/nordabiz/hourly/"
    exit 1
fi

BACKUP_FILE="$1"

# Sprawdzenie czy backup istnieje
if [ ! -f "$BACKUP_FILE" ]; then
    error "Plik backupu nie istnieje: $BACKUP_FILE"
fi

# Sprawdzenie uprawnień (root lub sudo)
if [ "$EUID" -ne 0 ]; then
    error "Ten skrypt wymaga uprawnień root. Użyj: sudo $0 $1"
fi

# Potwierdzenie od użytkownika
echo ""
echo "=========================================="
echo "  NordaBiz Disaster Recovery Restore"
echo "=========================================="
echo ""
echo "Backup: $BACKUP_FILE"
echo "Rozmiar: $(du -h "$BACKUP_FILE" | cut -f1)"
echo "Data modyfikacji: $(stat -c %y "$BACKUP_FILE" 2>/dev/null || stat -f %Sm "$BACKUP_FILE")"
echo ""
echo -e "${YELLOW}UWAGA: Ta operacja nadpisze obecną bazę danych!${NC}"
echo ""
read -p "Czy kontynuować? (tak/nie): " CONFIRM

if [ "$CONFIRM" != "tak" ]; then
    echo "Anulowano."
    exit 0
fi

# Rozpoczęcie procesu restore
log "Rozpoczynam przywracanie z: $BACKUP_FILE"

# Krok 1: Zatrzymanie aplikacji
log "Krok 1/5: Zatrzymywanie aplikacji..."
systemctl stop "$APP_SERVICE" || warn "Aplikacja już zatrzymana"

# Krok 2: Backup obecnej bazy (na wszelki wypadek)
SAFETY_BACKUP="/tmp/nordabiz_pre_restore_$(date +%Y%m%d_%H%M%S).dump"
log "Krok 2/5: Tworzenie backupu bezpieczeństwa: $SAFETY_BACKUP"
sudo -u postgres pg_dump -Fc "$DB_NAME" > "$SAFETY_BACKUP" 2>/dev/null || warn "Nie udało się utworzyć backupu bezpieczeństwa (baza może być uszkodzona)"

# Krok 3: Usunięcie i odtworzenie bazy
log "Krok 3/5: Przywracanie bazy danych..."

# Zamknięcie wszystkich połączeń
sudo -u postgres psql -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$DB_NAME' AND pid <> pg_backend_pid();" 2>/dev/null || true

# Usunięcie i utworzenie bazy
sudo -u postgres psql -c "DROP DATABASE IF EXISTS $DB_NAME;" 2>/dev/null || error "Nie można usunąć bazy danych"
sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_USER;" || error "Nie można utworzyć bazy danych"

# Przywrócenie z backupu
sudo -u postgres pg_restore -d "$DB_NAME" -O --role="$DB_USER" "$BACKUP_FILE" || error "Nie można przywrócić bazy z backupu"

log "Baza danych przywrócona pomyślnie"

# Krok 4: Nadanie uprawnień
log "Krok 4/5: Nadawanie uprawnień..."
sudo -u postgres psql -d "$DB_NAME" -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO $DB_USER;"
sudo -u postgres psql -d "$DB_NAME" -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO $DB_USER;"

# Krok 5: Uruchomienie aplikacji
log "Krok 5/5: Uruchamianie aplikacji..."
systemctl start "$APP_SERVICE"

# Oczekiwanie na uruchomienie
sleep 5

# Weryfikacja health check
log "Weryfikacja health check..."
HEALTH_RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" "$HEALTH_URL" 2>/dev/null || echo "000")

if [ "$HEALTH_RESPONSE" = "200" ]; then
    log "Health check: OK (HTTP 200)"
else
    warn "Health check zwrócił: HTTP $HEALTH_RESPONSE"
    warn "Sprawdź logi: journalctl -u $APP_SERVICE -n 50"
fi

# Podsumowanie
echo ""
echo "=========================================="
echo "  Restore zakończony"
echo "=========================================="
echo ""
log "Restore zakończony pomyślnie"
echo "Backup bezpieczeństwa: $SAFETY_BACKUP"
echo ""
echo "Weryfikacja:"
echo "  - Health check: curl -I http://localhost:5000/health"
echo "  - Logi: journalctl -u $APP_SERVICE -f"
echo "  - Status: systemctl status $APP_SERVICE"
echo ""

# Sprawdzenie liczby rekordów
COMPANY_COUNT=$(sudo -u postgres psql -d "$DB_NAME" -t -c "SELECT COUNT(*) FROM companies;" 2>/dev/null | xargs)
log "Liczba firm w bazie: $COMPANY_COUNT"

exit 0
