#!/bin/bash

# Enhanced Subdomain Setup Script Part 1 with Error Handling and SSL Certificate Generation
# Version: 2.0

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

# Logging function
log_step() {
    echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] STEP: $1${NC}"
}

log_success() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] SUCCESS: $1${NC}"
}

log_error() {
    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}"
}

log_warning() {
    echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}"
}

# Error handling function
handle_error() {
    local step_name="$1"
    local error_code="$2"
    local continue_anyway="${3:-false}"
    
    log_error "$step_name failed with exit code $error_code"
    
    if [[ "$continue_anyway" == "true" ]]; then
        log_warning "Continuing with next step despite error..."
        return 0
    else
        log_error "Stopping execution due to critical error in $step_name"
        exit $error_code
    fi
}

# Function to retry commands with exponential backoff
retry_command() {
    local max_attempts="$1"
    local delay="$2"
    local command="${@:3}"
    local attempt=1
    
    while [ $attempt -le $max_attempts ]; do
        log_step "Attempt $attempt/$max_attempts: $command"
        
        if eval "$command"; then
            log_success "Command succeeded on attempt $attempt"
            return 0
        else
            if [ $attempt -eq $max_attempts ]; then
                log_error "Command failed after $max_attempts attempts"
                return 1
            fi
            
            log_warning "Command failed, retrying in ${delay}s..."
            sleep $delay
            delay=$((delay * 2))  # Exponential backoff
            attempt=$((attempt + 1))
        fi
    done
}

# Check if required parameters are provided
if [ $# -ne 11 ]; then
    echo "Usage: $0 SUBDOMAIN DOMAIN IP EMAIL TITLE_NAME PHONE_NUMBER ADDRESS CATEGORY SUBCATEGORY TEMPLATE HOMEPAGE"
    exit 1
fi

# Assign input parameters to variables
SUBDOMAIN=$1
DOMAIN=$2
IP=$3
EMAIL=$4
TITLE_NAME=$5
PHONE_NUMBER=$6
ADDRESS=$7
CATEGORY=$8
SUBCATEGORY=$9
TEMPLATE=${10}
HOMEPAGE=${11}

FIRST_PART="${DOMAIN%%.*}"
EMAIL_ADMIN="${SUBDOMAIN}@${SUBDOMAIN}.${DOMAIN}"

log_step "Starting subdomain setup for ${SUBDOMAIN}.${DOMAIN}"
echo "Domain parts: FIRST_PART=$FIRST_PART"

# Generate random passwords
password_admin=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12)
password=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12)

# Define database configuration
DB_NAME="${SUBDOMAIN}DB"
TABLE_PREFIX="${SUBDOMAIN}_wp_"

# SMTP configuration - these should be moved to environment variables
SMTP_SERVER="in-v3.mailjet.com"
SMTP_PORT="587"
SMTP_USER="129c46308e46f861e50776d98fd67379"
SMTP_PASS="19b45e04bcee86493fad483bfe1464e4"
FROM_EMAIL="info@best-local-services.com"
FROM_NAME="Best Local Services"

log_step "Generated credentials: admin_password_length=${#password_admin}, user_password_length=${#password}"

# Create shared variables file for the second script
SHARED_VARS_FILE="/tmp/website_setup_${SUBDOMAIN}_vars.sh"
cat > "$SHARED_VARS_FILE" << EOF
# Shared variables for website setup
SUBDOMAIN="$SUBDOMAIN"
DOMAIN="$DOMAIN"
IP="$IP"
EMAIL="$EMAIL"
TITLE_NAME="$TITLE_NAME"
PHONE_NUMBER="$PHONE_NUMBER"
ADDRESS="$ADDRESS"
CATEGORY="$CATEGORY"
SUBCATEGORY="$SUBCATEGORY"
TEMPLATE="$TEMPLATE"
HOMEPAGE="$HOMEPAGE"
FIRST_PART="$FIRST_PART"
EMAIL_ADMIN="$EMAIL_ADMIN"
password_admin="$password_admin"
password="$password"
DB_NAME="$DB_NAME"
TABLE_PREFIX="$TABLE_PREFIX"
SMTP_SERVER="$SMTP_SERVER"
SMTP_PORT="$SMTP_PORT"
SMTP_USER="$SMTP_USER"
SMTP_PASS="$SMTP_PASS"
FROM_EMAIL="$FROM_EMAIL"
FROM_NAME="$FROM_NAME"
EOF

log_step "Shared variables file created: $SHARED_VARS_FILE"

# =============================================================================
# STEP 1: ADD DNS RECORD TO HOSTINGER
# =============================================================================
log_step "Adding DNS record to Hostinger"

if /home/find-local-services/public_html/hostinger_dns_script.sh --domain="${DOMAIN}" --name="${SUBDOMAIN}" --content="${IP}" --token=lwebd9UCeZtV23eEY2I5D29YjB95XpDgaL2FTQRd5fa30df6; then
    log_success "DNS record added successfully"
else
    handle_error "DNS record creation" $? true
fi

# Wait for DNS propagation
log_step "Waiting for DNS propagation (30 seconds)"
sleep 30

# =============================================================================
# STEP 2: CREATE VIRTUAL SERVER
# =============================================================================
log_step "Creating virtual server for ${SUBDOMAIN}.${DOMAIN}"

# Use retry mechanism for virtual server creation
if retry_command 3 10 "sudo virtualmin create-domain --domain '${SUBDOMAIN}.${DOMAIN}' --parent '${DOMAIN}' --pass '${password}' --dir --webmin --dns --web --ssl --mysql"; then
    log_success "Virtual server created successfully"
else
    handle_error "Virtual server creation" $? false
fi

# =============================================================================
# STEP 3: GENERATE SSL CERTIFICATE
# =============================================================================
log_step "Generating Let's Encrypt SSL certificate for ${SUBDOMAIN}.${DOMAIN}"

# Wait a bit for the domain to be fully configured
sleep 15

if retry_command 3 20 "sudo virtualmin generate-letsencrypt-cert --domain '${SUBDOMAIN}.${DOMAIN}'"; then
    log_success "SSL certificate generated successfully"
else
    log_warning "SSL certificate generation failed - continuing without SSL"
fi

# =============================================================================
# STEP 3.5: CALL SECOND SETUP SCRIPT
# =============================================================================
log_step "Calling second setup script for WordPress installation and configuration"

# Get the directory where this script is located
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SECOND_SCRIPT="${SCRIPT_DIR}/setup_subdomain2.sh"

if [[ -f "$SECOND_SCRIPT" ]]; then
    log_step "Executing second setup script: $SECOND_SCRIPT"
    if bash "$SECOND_SCRIPT" "$SHARED_VARS_FILE"; then
        log_success "Second setup script completed successfully"
        # Clean up the shared variables file
        rm -f "$SHARED_VARS_FILE"
        log_success "Website setup completed successfully!"
        echo ""
        echo "================================================================"
        echo "                    SETUP COMPLETE                             "
        echo "================================================================"
        echo "Website URL: https://${SUBDOMAIN}.${DOMAIN}"
        echo "Admin Panel: https://${SUBDOMAIN}.${DOMAIN}/wp-admin"
        echo "Customer Login: ${SUBDOMAIN} / ${password}"
        echo "Admin Login: ${SUBDOMAIN}_admin / ${password_admin}"
        echo "Database: ${DB_NAME}"
        echo "================================================================"
        echo ""
        echo "SITE_CREATION_SUCCESS"
        exit 0
    else
        log_error "Second setup script failed"
        rm -f "$SHARED_VARS_FILE"
        exit 1
    fi
else
    log_error "Second setup script not found: $SECOND_SCRIPT"
    rm -f "$SHARED_VARS_FILE"
    exit 1
fi
