#!/bin/bash
#
# Phase 4 Data Migration - Database Backup Script
#
# This script creates full backups of all databases before data migration.
# Run this BEFORE any Phase 4 migration scripts!
#
# Usage: ./phase4_backup.sh [backup_directory]
#
# Requirements:
# - MySQL client with mysqldump installed
# - Database credentials in ~/.my.cnf or environment variables
# - Sufficient disk space for backups
#

set -e  # Exit on any error

# Configuration
BACKUP_DIR="${1:-/tmp/buyerkiosk_backup_$(date +%Y%m%d_%H%M%S)}"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
CENTRAL_DB="kiosk_users"

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

echo "=============================================="
echo "Phase 4 Database Backup Script"
echo "=============================================="
echo ""
echo "Backup directory: $BACKUP_DIR"
echo "Timestamp: $TIMESTAMP"
echo ""

# Create backup directory
mkdir -p "$BACKUP_DIR"

# Function to backup a single database
backup_database() {
    local db_name=$1
    local backup_file="$BACKUP_DIR/${db_name}_${TIMESTAMP}.sql"

    echo -n "  Backing up $db_name... "

    if mysqldump --single-transaction --quick --lock-tables=false "$db_name" > "$backup_file" 2>/dev/null; then
        local size=$(du -h "$backup_file" | cut -f1)
        echo -e "${GREEN}OK${NC} ($size)"

        # Compress the backup
        gzip "$backup_file"
        return 0
    else
        echo -e "${RED}FAILED${NC}"
        return 1
    fi
}

# Function to verify backup integrity
verify_backup() {
    local backup_file=$1

    # Check if file exists and is not empty
    if [ -f "$backup_file" ] && [ -s "$backup_file" ]; then
        return 0
    fi
    return 1
}

echo "Step 1: Backing up central database ($CENTRAL_DB)"
echo "----------------------------------------------"
if backup_database "$CENTRAL_DB"; then
    echo -e "  ${GREEN}Central database backup complete${NC}"
else
    echo -e "  ${RED}ERROR: Failed to backup central database!${NC}"
    echo "  Aborting migration backup."
    exit 1
fi

echo ""
echo "Step 2: Discovering store databases"
echo "----------------------------------------------"

# Get list of all kiosk_* databases (excluding kiosk_users and kiosk_buykiosk)
STORE_DBS=$(mysql -N -e "SHOW DATABASES LIKE 'kiosk_%'" 2>/dev/null | grep -v "kiosk_users" | grep -v "kiosk_buykiosk" || true)

if [ -z "$STORE_DBS" ]; then
    echo -e "  ${YELLOW}No store databases found${NC}"
else
    STORE_COUNT=$(echo "$STORE_DBS" | wc -l | tr -d ' ')
    echo "  Found $STORE_COUNT store databases"
fi

echo ""
echo "Step 3: Backing up store databases"
echo "----------------------------------------------"

SUCCESS_COUNT=0
FAIL_COUNT=0

for db in $STORE_DBS; do
    if backup_database "$db"; then
        ((SUCCESS_COUNT++))
    else
        ((FAIL_COUNT++))
    fi
done

echo ""
echo "Step 4: Creating backup manifest"
echo "----------------------------------------------"

MANIFEST_FILE="$BACKUP_DIR/backup_manifest.txt"
cat > "$MANIFEST_FILE" << EOF
Phase 4 Database Backup Manifest
================================
Created: $(date)
Timestamp: $TIMESTAMP
Backup Directory: $BACKUP_DIR

Central Database:
-----------------
$CENTRAL_DB

Store Databases:
----------------
$STORE_DBS

Backup Files:
-------------
$(ls -la "$BACKUP_DIR"/*.sql.gz 2>/dev/null || echo "No backup files found")

Statistics:
-----------
Total databases backed up: $((SUCCESS_COUNT + 1))
Failed backups: $FAIL_COUNT
Total backup size: $(du -sh "$BACKUP_DIR" | cut -f1)
EOF

echo "  Manifest created: $MANIFEST_FILE"

echo ""
echo "=============================================="
echo "Backup Summary"
echo "=============================================="
echo -e "Central database: ${GREEN}OK${NC}"
echo -e "Store databases:  ${GREEN}$SUCCESS_COUNT OK${NC}, ${RED}$FAIL_COUNT FAILED${NC}"
echo "Total size: $(du -sh "$BACKUP_DIR" | cut -f1)"
echo "Location: $BACKUP_DIR"
echo ""

if [ $FAIL_COUNT -eq 0 ]; then
    echo -e "${GREEN}All backups completed successfully!${NC}"
    echo ""
    echo "You can now safely proceed with Phase 4 data migration."
    echo ""
    echo "To restore if needed:"
    echo "  gunzip -c $BACKUP_DIR/kiosk_users_${TIMESTAMP}.sql.gz | mysql kiosk_users"
    echo ""
    exit 0
else
    echo -e "${RED}Some backups failed! Do not proceed with migration.${NC}"
    exit 1
fi
