#!/usr/bin/env bash
# LocalPulse Backup & Restore Script
# Usage: 
#   ./backup.sh              # Create backup
#   ./backup.sh restore      # Restore from backup
#   ./backup.sh list         # List available backups

set -euo pipefail

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log_info()  { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn()  { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }

BACKUP_DIR="${BACKUP_DIR:-$(pwd)/backups}"
DB_NAME="${DB_NAME:-localpulse}"
DB_USER="${DB_USER:-root}"
DB_PASS="${DB_PASSWORD:-}"
APP_DIR="$(pwd)"

mkdir -p "$BACKUP_DIR"

cmd_backup() {
    local TIMESTAMP=$(date +%Y%m%d_%H%M%S)
    local BACKUP_FILE="$BACKUP_DIR/localpulse_backup_${TIMESTAMP}.tar.gz"
    
    log_info "Creating backup: $BACKUP_FILE"
    
    # Backup database
    local SQL_FILE="$BACKUP_DIR/db_${TIMESTAMP}.sql"
    if [ -n "$DB_PASS" ]; then
        mysqldump -h"${DB_HOST:-127.0.0.1}" -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$SQL_FILE" 2>/dev/null || \
        mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$SQL_FILE" 2>/dev/null || {
            log_error "Database backup failed"
            return 1
        }
    else
        mysqldump -h"${DB_HOST:-127.0.0.1}" -u"$DB_USER" "$DB_NAME" > "$SQL_FILE" 2>/dev/null || {
            log_error "Database backup failed"
            return 1
        }
    fi
    log_info "Database backed up ($(du -h "$SQL_FILE" | cut -f1))"
    
    # Create archive
    tar -czf "$BACKUP_FILE" \
        --exclude='node_modules' \
        --exclude='.git' \
        --exclude='storage/framework/cache' \
        --exclude='storage/logs' \
        -C "$APP_DIR" \
        .env "$SQL_FILE" database/ app/ resources/ routes/ public/ composer.json composer.lock \
        -C "$BACKUP_DIR" "db_${TIMESTAMP}.sql" 2>/dev/null
    
    # Move SQL into archive properly
    tar -rf "$BACKUP_FILE" -C "$BACKUP_DIR" "db_${TIMESTAMP}.sql" 2>/dev/null || true
    
    rm -f "$SQL_FILE"
    
    log_info "Backup created: $BACKUP_FILE ($(du -h "$BACKUP_FILE" | cut -f1))"
    log_info "Files included: .env, database/, app/, resources/, routes/, public/, config/"
}

cmd_restore() {
    local LATEST=$(ls -t "$BACKUP_DIR"/*.tar.gz 2>/dev/null | head -1)
    if [ -z "$LATEST" ]; then
        log_error "No backup found in $BACKUP_DIR"
        exit 1
    fi
    
    log_info "Restoring from: $LATEST"
    read -p "This will overwrite current files and database. Continue? (y/N) " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        log_info "Cancelled"
        exit 0
    fi
    
    # Extract
    tar -xzf "$LATEST" -C "$APP_DIR"
    
    # Restore database if SQL included
    local SQL_FILE=$(tar -tzf "$LATEST" | grep "db_.*\.sql" | head -1)
    if [ -n "$SQL_FILE" ]; then
        log_info "Restoring database from $SQL_FILE..."
        tar -xzf "$LATEST" -C "$BACKUP_DIR" "$SQL_FILE"
        mysql -h"${DB_HOST:-127.0.0.1}" -u"$DB_USER" ${DB_PASS:+-p"$DB_PASS"} "$DB_NAME" < "$BACKUP_DIR/$SQL_FILE" 2>/dev/null || {
            mysql -u"$DB_USER" ${DB_PASS:+-p"$DB_PASS"} "$DB_NAME" < "$BACKUP_DIR/$SQL_FILE" 2>/dev/null || {
                log_error "Database restore failed"
                return 1
            }
        }
        rm -f "$BACKUP_DIR/$SQL_FILE"
        log_info "Database restored"
    fi
    
    # Re-optimize
    cd "$APP_DIR"
    php artisan optimize --force 2>/dev/null || true
    php artisan storage:link 2>/dev/null || true
    
    log_info "Restore complete"
}

cmd_list() {
    log_info "Available backups in $BACKUP_DIR:"
    ls -lh "$BACKUP_DIR"/*.tar.gz 2>/dev/null || log_info "No backups found"
}

case "${1:-backup}" in
    backup)  cmd_backup ;;
    restore) cmd_restore ;;
    list)    cmd_list ;;
    *) echo "Usage: $0 {backup|restore|list}"; exit 1 ;;
esac