#!/bin/bash

# Deploy to Dev Environment
# Automated deployment script for Show Prima dev server
#
# This script uses modular deployment libraries following atomic design:
#   - Atoms: Basic functions (_deploy-atoms.sh)
#   - Molecules: Combined operations (_deploy-molecules.sh)
#   - Organisms: Complete workflows (_deploy-organisms.sh)
#
# Usage:
#   ./scripts/deploy-dev.sh [OPTIONS]
#
# Options:
#   --seed-roles     Force re-seed roles even if they exist
#   --no-backup      Skip database backup (NOT RECOMMENDED)
#   --skip-checks    Skip pre-deployment validation checks
#   --branch=NAME    Deploy specific branch (default: dev)
#   --help           Show this help message
#
# Examples:
#   ./scripts/deploy-dev.sh                    # Standard deployment
#   ./scripts/deploy-dev.sh --seed-roles       # Force re-seed roles
#   ./scripts/deploy-dev.sh --branch=main      # Deploy main branch

set -e  # Exit on error

# ==============================================================================
# INITIALIZATION
# ==============================================================================

# Change to project root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
cd "$PROJECT_ROOT"

# Load deployment libraries
source "$SCRIPT_DIR/_deploy-atoms.sh"
source "$SCRIPT_DIR/_deploy-molecules.sh"
source "$SCRIPT_DIR/_deploy-organisms.sh"

# ==============================================================================
# ARGUMENT PARSING
# ==============================================================================

FORCE_SEED_ROLES=false
SKIP_BACKUP=false
SKIP_CHECKS=false
BRANCH="dev"

show_help() {
    cat << EOF
Deploy to Dev Environment

Usage: $0 [OPTIONS]

Options:
  --seed-roles      Force re-seed roles even if they exist
  --no-backup       Skip database backup (NOT RECOMMENDED)
  --skip-checks     Skip pre-deployment validation checks
  --branch=NAME     Deploy specific branch (default: dev)
  --help            Show this help message

Examples:
  $0                      # Standard deployment
  $0 --seed-roles         # Force re-seed roles
  $0 --branch=main        # Deploy main branch

EOF
    exit 0
}

for arg in "$@"; do
    case $arg in
        --seed-roles)
            FORCE_SEED_ROLES=true
            shift
            ;;
        --no-backup)
            SKIP_BACKUP=true
            shift
            ;;
        --skip-checks)
            SKIP_CHECKS=true
            shift
            ;;
        --branch=*)
            BRANCH="${arg#*=}"
            shift
            ;;
        --help|-h)
            show_help
            ;;
        *)
            log_error "Unknown option: $arg"
            echo "Run with --help for usage information"
            exit 1
            ;;
    esac
done

# ==============================================================================
# DEPLOYMENT START
# ==============================================================================

log_section "Show Prima - Dev Deployment"

log_info "Deployment Configuration:"
echo "  Branch:           $BRANCH"
echo "  Force Seed Roles: $FORCE_SEED_ROLES"
echo "  Skip Backup:      $SKIP_BACKUP"
echo "  Skip Checks:      $SKIP_CHECKS"
echo ""

# Setup PHP environment (detect cPanel PHP 8.1)
setup_php_environment

# Track deployment state for rollback
DEPLOYMENT_STATE="started"
DEPLOYMENT_START_TIME=$(date +%s)

# Rebuild autoload cache before validation (in case of manual git pull).
# NOTE: No --no-dev here because the pre-check runs before composer install,
# and the environment may still have dev packages from a previous run. The
# main composer install in deploy_code_workflow handles --no-dev properly
# after clearing bootstrap/cache/packages.php.
log_info "Rebuilding autoload cache..."
if composer dump-autoload --optimize 2>&1 | grep -q "Generated"; then
    log_success "Autoload cache rebuilt"
else
    log_warning "Could not rebuild autoload cache (non-critical)"
fi

# ==============================================================================
# STEP 0: PRE-DEPLOYMENT VALIDATION
# ==============================================================================

if [[ "$SKIP_CHECKS" == "false" ]]; then
    log_step 0 9 "Pre-Deployment Validation"

    if ! pre_deployment_checks; then
        log_error "Pre-deployment checks failed. Aborting deployment."
        log_info "Use --skip-checks to bypass validation (not recommended)"
        exit 1
    fi
else
    log_warning "Skipping pre-deployment checks (--skip-checks flag)"
fi

# ==============================================================================
# STEP 1: DATABASE BACKUP
# ==============================================================================

log_step 1 9 "Creating Database Backup"

if [[ "$SKIP_BACKUP" == "false" ]]; then
    if ! backup_workflow; then
        log_error "Backup failed. Aborting deployment."
        log_info "Critical: Database backup is required for safe deployment"
        exit 1
    fi

    DEPLOYMENT_STATE="backup_complete"
else
    log_warning "Skipping database backup (--no-backup flag)"
    log_warning "This is NOT RECOMMENDED for production deployments!"
fi

# ==============================================================================
# STEP 2: CODE DEPLOYMENT
# ==============================================================================

log_step 2 9 "Deploying Code"

if ! deploy_code_workflow "$BRANCH"; then
    log_error "Code deployment failed"
    exit 1
fi

DEPLOYMENT_STATE="code_deployed"

# ==============================================================================
# STEP 3: DATABASE DEPLOYMENT
# ==============================================================================

log_step 3 9 "Deploying Database"

if ! deploy_database_workflow "$FORCE_SEED_ROLES"; then
    log_error "Database deployment failed"
    exit 1
fi

DEPLOYMENT_STATE="database_deployed"

# ==============================================================================
# STEP 4: QUEUE WORKER DEPLOYMENT
# ==============================================================================

log_step 4 9 "Deploying Queue Workers"

if ! deploy_queue_workflow; then
    log_error "Queue worker deployment failed"
    # Don't exit - we can continue without queue worker
    log_warning "Deployment continuing despite queue worker failure"
fi

DEPLOYMENT_STATE="queue_deployed"

# ==============================================================================
# STEP 5: POST-DEPLOYMENT VALIDATION
# ==============================================================================

log_step 5 9 "Post-Deployment Validation"

if ! post_deployment_validation; then
    log_warning "Some post-deployment checks failed"
    log_info "Review the warnings above and fix if necessary"
    # Don't exit - deployment might still be functional
fi

DEPLOYMENT_STATE="validated"

# ==============================================================================
# STEP 6: HEALTH CHECK
# ==============================================================================

log_step 6 9 "Health Check"

health_check || log_warning "Health check completed with warnings"

# ==============================================================================
# DEPLOYMENT COMPLETE
# ==============================================================================

DEPLOYMENT_END_TIME=$(date +%s)
DEPLOYMENT_DURATION=$((DEPLOYMENT_END_TIME - DEPLOYMENT_START_TIME))

log_section "Deployment Complete!"

log_success "Deployment completed successfully in ${DEPLOYMENT_DURATION}s ✓"
echo ""

# Show deployment status report
deployment_status_report

# Save deployment metadata
DEPLOYMENT_LOG="storage/logs/deployment-$(get_timestamp_filename).log"
cat > "$DEPLOYMENT_LOG" << EOF
Deployment Metadata
===================
Timestamp:     $(get_timestamp)
Duration:      ${DEPLOYMENT_DURATION}s
Branch:        $BRANCH
Commit:        $(get_git_commit)
PHP Version:   $(get_php_version)
Environment:   $(get_app_env)
Database:      $(get_db_type) ($(get_db_name))
Status:        SUCCESS
EOF

log_info "Deployment log saved: $DEPLOYMENT_LOG"
echo ""

log_success "✅ Ready for testing!"
