#!/bin/bash

# Deploy Organisms - Organism Workflows Library
# Complete workflows that combine molecular operations
#
# This file contains complete, production-ready workflows that orchestrate
# multiple molecular operations into deployable units.
#
# Usage:
#   source "$(dirname "$0")/_deploy-atoms.sh"
#   source "$(dirname "$0")/_deploy-molecules.sh"
#   source "$(dirname "$0")/_deploy-organisms.sh"

# ==============================================================================
# PRE-DEPLOYMENT VALIDATION
# ==============================================================================

# Run comprehensive pre-deployment checks
# Returns: 0 if all checks pass, 1 otherwise
pre_deployment_checks() {
    log_section "Pre-Deployment Validation"

    local failed=0

    # Check 1: Git repository
    log_info "Checking Git repository..."
    if ! git rev-parse --git-dir > /dev/null 2>&1; then
        log_error "Not a Git repository"
        ((failed++))
    else
        local branch=$(get_git_branch)
        local commit=$(get_git_commit_short)
        log_success "Git repository OK (branch: $branch, commit: $commit)"
    fi

    # Check 2: .env file exists
    log_info "Checking .env file..."
    if ! file_exists ".env"; then
        log_error ".env file not found"
        ((failed++))
    else
        log_success ".env file exists"
    fi

    # Check 3: Required commands
    log_info "Checking required commands..."
    local required_commands=("php" "composer" "git")
    for cmd in "${required_commands[@]}"; do
        if ! command_exists "$cmd"; then
            log_error "Required command not found: $cmd"
            ((failed++))
        fi
    done
    if [[ $failed -eq 0 ]]; then
        log_success "All required commands available"
    fi

    # Check 4: PHP version
    log_info "Checking PHP version..."
    local php_version=$(get_php_version)
    if check_php_version "8.0"; then
        log_success "PHP version OK: $php_version"
    else
        log_error "PHP version too old: $php_version (required: 8.0+)"
        ((failed++))
    fi

    # Check 5: Database connection
    log_info "Checking database connection..."
    if php artisan tinker --execute="DB::connection()->getPdo();" > /dev/null 2>&1; then
        local db_name=$(get_db_name)
        log_success "Database connection OK: $db_name"
    else
        log_error "Cannot connect to database"
        ((failed++))
    fi

    # Check 6: Storage directory writable
    log_info "Checking storage permissions..."
    if is_writable "storage"; then
        log_success "Storage directory is writable"
    else
        log_error "Storage directory not writable"
        ((failed++))
    fi

    # Check 7: Seeder passwords (if AdminSeeder exists)
    if file_exists "database/seeders/AdminSeeder.php"; then
        if validate_seeder_passwords; then
            # Success already logged by function
            :
        else
            log_warning "Seeder passwords not configured (non-critical)"
            # Don't increment failed - this is a warning only
        fi
    fi

    # Summary
    echo ""
    if [[ $failed -eq 0 ]]; then
        log_success "All pre-deployment checks passed ✓"
        return 0
    else
        log_error "$failed pre-deployment check(s) failed"
        return 1
    fi
}

# ==============================================================================
# POST-DEPLOYMENT VALIDATION
# ==============================================================================

# Run comprehensive post-deployment checks
# Returns: 0 if all checks pass, 1 otherwise
post_deployment_validation() {
    log_section "Post-Deployment Validation"

    local failed=0

    # Check 1: Laravel can boot
    log_info "Checking Laravel application..."
    if php artisan about --only=environment 2>&1 | grep -q "Environment"; then
        local app_env=$(get_app_env)
        log_success "Laravel application OK (environment: $app_env)"
    else
        log_error "Laravel application cannot boot"
        ((failed++))
    fi

    # Check 2: Database migrations
    log_info "Checking database migrations..."
    if ! has_pending_migrations; then
        log_success "All migrations completed"
    else
        log_warning "Pending migrations detected"
        # Don't fail - this might be intentional
    fi

    # Check 3: Config cache
    log_info "Checking config cache..."
    if file_exists "bootstrap/cache/config.php"; then
        log_success "Config cache exists"
    else
        log_warning "Config cache not found"
    fi

    # Check 4: Queue worker
    log_info "Checking queue worker..."
    if is_queue_worker_running; then
        local pid=$(get_queue_worker_pid)
        log_success "Queue worker is running (PID: $pid)"
    else
        log_error "Queue worker is not running"
        ((failed++))
    fi

    # Check 5: Queue health
    log_info "Checking queue health..."
    if file_exists "scripts/queue-monitor.sh"; then
        local queue_output=$(./scripts/queue-monitor.sh once 2>/dev/null)
        if [[ $? -eq 0 ]]; then
            log_success "Queue system is healthy"
        else
            log_warning "Queue system check failed (non-critical)"
        fi
    fi

    # Check 6: Email system
    log_info "Checking email system..."
    if php artisan email:check 2>&1 | grep -q "✓"; then
        log_success "Email system is healthy"
    else
        log_warning "Email system check inconclusive (non-critical)"
    fi

    # Summary
    echo ""
    if [[ $failed -eq 0 ]]; then
        log_success "All post-deployment checks passed ✓"
        return 0
    else
        log_error "$failed post-deployment check(s) failed"
        return 1
    fi
}

# ==============================================================================
# HEALTH CHECK WORKFLOW
# ==============================================================================

# Complete health check workflow
# Returns: 0 if system is healthy, 1 otherwise
health_check() {
    log_section "System Health Check"

    local warnings=0
    local errors=0

    # Check queue status
    log_info "Queue Status:"
    if is_queue_worker_running; then
        echo "  ✓ Queue worker running (PID: $(get_queue_worker_pid))"
    else
        echo "  ✗ Queue worker not running"
        ((errors++))
    fi

    # Check pending jobs (using queue-monitor if available)
    if file_exists "scripts/queue-monitor.sh"; then
        echo ""
        ./scripts/queue-monitor.sh once 2>/dev/null || true
    fi

    # Check email system
    echo ""
    log_info "Email System:"
    php artisan email:check 2>&1 | grep -E "✓|✗|⚠" || true

    # Summary
    echo ""
    if [[ $errors -eq 0 ]] && [[ $warnings -eq 0 ]]; then
        log_success "System is healthy ✓"
        return 0
    elif [[ $errors -eq 0 ]]; then
        log_warning "System is healthy with $warnings warning(s)"
        return 0
    else
        log_error "System has $errors error(s) and $warnings warning(s)"
        return 1
    fi
}

# ==============================================================================
# BACKUP WORKFLOW
# ==============================================================================

# Complete backup workflow with validation
# Returns: 0 on success, 1 on failure
backup_workflow() {
    log_section "Database Backup"

    # Create backup
    if ! backup_database; then
        log_error "Backup workflow failed"
        return 1
    fi

    # Verify backup was created
    if ! verify_recent_backup 1; then
        log_error "Backup verification failed"
        return 1
    fi

    log_success "Backup workflow completed ✓"
    return 0
}

# ==============================================================================
# DEPLOYMENT WORKFLOW
# ==============================================================================

# Complete code deployment workflow
# Returns: 0 on success, 1 on failure
deploy_code_workflow() {
    local branch="${1:-dev}"

    log_section "Code Deployment"

    # Pull latest code
    if ! git_pull_branch "$branch"; then
        return 1
    fi

    # Install dependencies
    if ! install_php_dependencies; then
        return 1
    fi

    # Clear caches
    if ! clear_caches; then
        log_warning "Cache clear had issues (non-critical)"
    fi

    # Rebuild config cache
    if ! rebuild_config_cache; then
        log_warning "Config cache rebuild failed (non-critical)"
    fi

    log_success "Code deployment completed ✓"
    return 0
}

# ==============================================================================
# DATABASE WORKFLOW
# ==============================================================================

# Complete database workflow (migrations + seeders)
# Args: $1 = force seed roles (true/false)
# Returns: 0 on success, 1 on failure
deploy_database_workflow() {
    local force_seed="${1:-false}"

    log_section "Database Deployment"

    # Run migrations
    if ! run_migrations; then
        return 1
    fi

    # Handle role seeding
    log_info "Checking roles and permissions..."

    if [[ "$force_seed" == "true" ]]; then
        log_info "Force seeding roles (--seed-roles flag)"
        run_seeder "RoleSeeder" || log_warning "RoleSeeder not found"
    elif roles_table_empty; then
        log_info "No roles found, seeding roles and permissions"
        run_seeder "RoleSeeder" || log_warning "RoleSeeder not found"
    else
        log_success "Roles already seeded"
        log_info "Tip: Use --seed-roles to force re-seed"
    fi

    # Run settings seeder (idempotent - safe to run multiple times)
    log_info "Seeding settings..."
    run_seeder "SettingsSeeder" || log_warning "SettingsSeeder not found or failed"

    # Run support labels seeder (idempotent - safe to run multiple times)
    log_info "Seeding support labels..."
    run_seeder "SupportLabelsSeeder" || log_warning "SupportLabelsSeeder not found or failed"

    log_success "Database deployment completed ✓"
    return 0
}

# ==============================================================================
# QUEUE WORKER WORKFLOW
# ==============================================================================

# Complete queue worker restart workflow
# Returns: 0 on success, 1 on failure
deploy_queue_workflow() {
    log_section "Queue Worker Deployment"

    if ! restart_queue_worker; then
        return 1
    fi

    # Wait for worker to stabilize
    sleep 2

    # Verify worker is running
    if ! is_queue_worker_running; then
        log_error "Queue worker failed to start"
        return 1
    fi

    log_success "Queue worker deployment completed ✓"
    return 0
}

# ==============================================================================
# ROLLBACK WORKFLOW
# ==============================================================================

# Rollback to previous state
# Returns: 0 on success, 1 on failure
rollback_workflow() {
    log_section "Rolling Back Deployment"

    log_warning "Rollback functionality not fully implemented yet"
    log_info "Manual rollback steps:"
    log_info "  1. Restore database: ./scripts/restore-db.sh <backup_file>"
    log_info "  2. Reset git: git reset --hard HEAD~1"
    log_info "  3. Clear caches: php artisan cache:clear"
    log_info "  4. Restart workers: ./scripts/start-queue-worker.sh"

    return 1
}

# ==============================================================================
# STATUS REPORTING
# ==============================================================================

# Generate deployment status report
# Returns: 0 always
deployment_status_report() {
    log_section "Deployment Status Report"

    echo -e "${COLOR_CYAN}Environment Information:${COLOR_NC}"
    echo "  PHP Version:     $(get_php_version)"
    echo "  Laravel Version: $(get_laravel_version)"
    echo "  App Environment: $(get_app_env)"
    echo "  Database:        $(get_db_type) ($(get_db_name))"
    echo "  Git Branch:      $(get_git_branch)"
    echo "  Git Commit:      $(get_git_commit_short)"
    echo ""

    echo -e "${COLOR_CYAN}System Status:${COLOR_NC}"
    if is_queue_worker_running; then
        echo "  Queue Worker:    Running (PID: $(get_queue_worker_pid))"
    else
        echo "  Queue Worker:    Stopped"
    fi

    if is_cpanel_server; then
        echo "  Server Type:     cPanel"
    else
        echo "  Server Type:     Standard"
    fi
    echo ""

    echo -e "${COLOR_CYAN}Quick Actions:${COLOR_NC}"
    echo "  Monitor logs:    tail -f storage/logs/laravel-\$(date +%Y-%m-%d).log"
    echo "  Check queue:     ./scripts/queue-monitor.sh"
    echo "  View worker:     screen -r queue-worker"
    echo "  Test emails:     ./scripts/test-email-system.sh"
    echo ""

    return 0
}

# ==============================================================================
# EXPORT FUNCTIONS
# ==============================================================================

export -f pre_deployment_checks post_deployment_validation health_check
export -f backup_workflow deploy_code_workflow deploy_database_workflow
export -f deploy_queue_workflow rollback_workflow deployment_status_report
