#!/bin/bash

# Database Dump Script
# Creates a full database dump for importing to live/production

# Load environment variables from .env file
if [ -f .env ]; then
    export $(grep -v '^#' .env | grep -E '^DB_' | xargs)
else
    echo "Error: .env file not found!"
    exit 1
fi

# Set database variables with defaults
DB_HOST=${DB_HOST:-127.0.0.1}
DB_PORT=${DB_PORT:-3306}
DB_DATABASE=${DB_DATABASE:-}
DB_USERNAME=${DB_USERNAME:-}
DB_PASSWORD=${DB_PASSWORD:-}

if [ -z "$DB_DATABASE" ]; then
    echo "Error: DB_DATABASE not set in .env file!"
    exit 1
fi

# Generate filename with timestamp
TIMESTAMP=$(date +%Y-%m-%d_%H%M%S)
FILENAME="database_dump_${DB_DATABASE}_${TIMESTAMP}.sql"
FILEPATH="./${FILENAME}"

echo "Starting database dump..."
echo "Database: ${DB_DATABASE}"
echo "Host: ${DB_HOST}:${DB_PORT}"
echo "Output file: ${FILENAME}"
echo ""

# Build mysqldump command
MYSQLDUMP_CMD="mysqldump -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USERNAME}"

# Add password if provided
if [ -n "$DB_PASSWORD" ]; then
    MYSQLDUMP_CMD="${MYSQLDUMP_CMD} -p${DB_PASSWORD}"
fi

# Add options for better compatibility
MYSQLDUMP_CMD="${MYSQLDUMP_CMD} --single-transaction --routines --triggers --events --quick --lock-tables=false"

# Add database name and output file
MYSQLDUMP_CMD="${MYSQLDUMP_CMD} ${DB_DATABASE} > ${FILEPATH} 2>&1"

# Execute mysqldump
eval $MYSQLDUMP_CMD
EXIT_CODE=$?

if [ $EXIT_CODE -ne 0 ]; then
    echo "Error: mysqldump failed with exit code ${EXIT_CODE}"
    echo "Please check your database credentials and connection."
    exit 1
fi

# Check if file was created and has content
if [ ! -f "$FILEPATH" ] || [ ! -s "$FILEPATH" ]; then
    echo "Error: Dump file was not created or is empty!"
    exit 1
fi

# Get file size
FILESIZE=$(stat -f%z "$FILEPATH" 2>/dev/null || stat -c%s "$FILEPATH" 2>/dev/null)
FILESIZE_MB=$(echo "scale=2; $FILESIZE / 1024 / 1024" | bc)

echo ""
echo "Database dump completed successfully!"
echo "File size: ${FILESIZE_MB} MB"
echo "File location: ${FILEPATH}"

# Try to compress the dump file
if command -v gzip &> /dev/null; then
    echo ""
    echo "Compressing dump file..."
    gzip -9 "$FILEPATH"
    GZ_FILEPATH="${FILEPATH}.gz"
    GZ_FILESIZE=$(stat -f%z "$GZ_FILEPATH" 2>/dev/null || stat -c%s "$GZ_FILEPATH" 2>/dev/null)
    GZ_FILESIZE_MB=$(echo "scale=2; $GZ_FILESIZE / 1024 / 1024" | bc)
    COMPRESSION_RATIO=$(echo "scale=1; (1 - $GZ_FILESIZE / $FILESIZE) * 100" | bc)
    
    echo "Compressed file: ${FILENAME}.gz (${GZ_FILESIZE_MB} MB)"
    echo "Compression ratio: ${COMPRESSION_RATIO}%"
    echo ""
    echo "Compressed file location: ${GZ_FILEPATH}"
    echo ""
    echo "To import to live database:"
    echo "  gunzip < ${FILENAME}.gz | mysql -u username -p database_name"
else
    echo ""
    echo "To import to live database:"
    echo "  mysql -u username -p database_name < ${FILENAME}"
fi

echo ""
echo "Done!"
