#!/bin/bash

# ──────────────────────────────────────────────────────
# BerryFoods Database Export Script
# ──────────────────────────────────────────────────────
# Exports the WordPress database to a SQL file in the project root
#
# Usage: ./scripts/db-export.sh [output_filename.sql]
#
# Examples:
#   ./scripts/db-export.sh                    # Exports to berryfoods_db.sql
#   ./scripts/db-export.sh backup_2024.sql    # Exports to backup_2024.sql
# ──────────────────────────────────────────────────────

set -e

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

# Configuration
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ENV_FILE="${PROJECT_ROOT}/.env"
EXPORT_DIR="${PROJECT_ROOT}"
DEFAULT_FILENAME="berryfoods_db.sql"

# Load environment variables
if [ -f "$ENV_FILE" ]; then
    export $(grep -v '^#' "$ENV_FILE" | xargs -d '\n' 2>/dev/null || grep -v '^#' "$ENV_FILE" | xargs)
fi

# Determine output filename
OUTPUT_FILENAME="${1:-$DEFAULT_FILENAME}"
OUTPUT_PATH="${EXPORT_DIR}/${OUTPUT_FILENAME}"

# Database configuration (adjust based on your setup)
DB_HOST="${DB_HOST:-localhost}"
DB_NAME="${MYSQL_DATABASE:-wordpress}"
DB_USER="${MYSQL_USER:-wordpress}"
DB_PASS="${MYSQL_PASSWORD:-wordpress_password_2024}"

# Docker container name (if using Docker)
DOCKER_CONTAINER="${DOCKER_CONTAINER:-db}"

echo -e "${BLUE}╔════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║       BerryFoods Database Export Script               ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════╝${NC}"
echo ""

# Function to check if Docker is available and container is running
check_docker() {
    if command -v docker &> /dev/null; then
        if docker ps --format '{{.Names}}' | grep -q "$DOCKER_CONTAINER"; then
            return 0
        fi
    fi
    return 1
}

# Function to export using Docker
export_via_docker() {
    echo -e "${YELLOW}→ Using Docker container: ${DOCKER_CONTAINER}${NC}"
    
    docker exec -t "$DOCKER_CONTAINER" mariadb-dump \
        -u"$DB_USER" \
        -p"$DB_PASS" \
        --databases "$DB_NAME" \
        --single-transaction \
        --quick \
        --lock-tables=false \
        --result-file=/tmp/db_export.sql
    
    echo -e "${YELLOW}→ Copying export from container...${NC}"
    docker cp "${DOCKER_CONTAINER}:/tmp/db_export.sql" "$OUTPUT_PATH"
    docker exec -t "$DOCKER_CONTAINER" rm /tmp/db_export.sql
}

# Function to export using local mysqldump
export_via_local() {
    echo -e "${YELLOW}→ Using local mysqldump${NC}"
    
    if ! command -v mysqldump &> /dev/null; then
        echo -e "${RED}✗ mysqldump not found. Please install MySQL client tools.${NC}"
        echo -e "${YELLOW}  Ubuntu/Debian: sudo apt-get install mysql-client${NC}"
        echo -e "${YELLOW}  macOS: brew install mysql${NC}"
        exit 1
    fi
    
    mysqldump \
        -h"$DB_HOST" \
        -u"$DB_USER" \
        -p"$DB_PASS" \
        --single-transaction \
        --quick \
        --lock-tables=false \
        "$DB_NAME" > "$OUTPUT_PATH"
}

# Main export logic
echo -e "${GREEN}Exporting database: ${DB_NAME}${NC}"
echo -e "${GREEN}Output file: ${OUTPUT_PATH}${NC}"
echo ""

if check_docker; then
    export_via_docker
else
    echo -e "${YELLOW}→ Docker container not found, attempting local connection...${NC}"
    export_via_local
fi

# Verify export
if [ -f "$OUTPUT_PATH" ]; then
    FILE_SIZE=$(du -h "$OUTPUT_PATH" | cut -f1)
    LINE_COUNT=$(wc -l < "$OUTPUT_PATH")
    
    echo ""
    echo -e "${GREEN}╔════════════════════════════════════════════════════════╗${NC}"
    echo -e "${GREEN}║                  Export Successful!                    ║${NC}"
    echo -e "${GREEN}╚════════════════════════════════════════════════════════╝${NC}"
    echo ""
    echo -e "  ${BLUE}File:${NC}     ${OUTPUT_PATH}"
    echo -e "  ${BLUE}Size:${NC}     ${FILE_SIZE}"
    echo -e "  ${BLUE}Lines:${NC}    ${LINE_COUNT}"
    echo ""
else
    echo -e "${RED}✗ Export failed!${NC}"
    exit 1
fi

# Optional: Compress the export
echo -e "${YELLOW}Compressing export...${NC}"
if command -v gzip &> /dev/null; then
    gzip -f "$OUTPUT_PATH"
    COMPRESSED_PATH="${OUTPUT_PATH}.gz"
    COMPRESSED_SIZE=$(du -h "$COMPRESSED_PATH" | cut -f1)
    echo -e "${GREEN}✓ Compressed: ${COMPRESSED_PATH} (${COMPRESSED_SIZE})${NC}"
fi

echo ""
echo -e "${GREEN}Done!${NC}"
