#!/bin/bash
# EXIM ERP Health Check & Monitoring Script
# Runs periodically via cron

set -e

# Configuration
APP_DIR="/var/www/html/exim-erp"
LOG_FILE="/var/log/exim-erp-monitor.log"
DISK_THRESHOLD=85
ERROR_THRESHOLD=100
MEMORY_THRESHOLD=90

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

print_status() {
    echo -e "${GREEN}[OK]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

# Check PHP-FPM
check_php_fpm() {
    if systemctl is-active --quiet php8.3-fpm; then
        print_status "PHP-FPM is running"
    else
        print_error "PHP-FPM is not running. Attempting restart..."
        systemctl restart php8.3-fpm
        log_message "PHP-FPM was restarted"
    fi
}

# Check Nginx
check_nginx() {
    if systemctl is-active --quiet nginx; then
        print_status "Nginx is running"
    else
        print_error "Nginx is not running. Attempting restart..."
        systemctl restart nginx
        log_message "Nginx was restarted"
    fi
}

# Check MySQL
check_mysql() {
    if systemctl is-active --quiet mysql; then
        print_status "MySQL is running"
    else
        print_error "MySQL is not running. Attempting restart..."
        systemctl restart mysql
        log_message "MySQL was restarted"
    fi
}

# Check Redis
check_redis() {
    if systemctl is-active --quiet redis-server; then
        print_status "Redis is running"
    else
        print_error "Redis is not running. Attempting restart..."
        systemctl restart redis-server
        log_message "Redis was restarted"
    fi
}

# Check Supervisor workers
check_supervisor() {
    if systemctl is-active --quiet supervisor; then
        WORKER_STATUS=$(supervisorctl status exim-erp-worker:* 2>/dev/null | grep -c "RUNNING" || echo 0)
        if [ "$WORKER_STATUS" -gt 0 ]; then
            print_status "Supervisor workers are running ($WORKER_STATUS active)"
        else
            print_warning "No supervisor workers running. Restarting..."
            supervisorctl restart exim-erp-worker:*
            log_message "Supervisor workers were restarted"
        fi
    else
        print_error "Supervisor is not running. Attempting restart..."
        systemctl restart supervisor
        log_message "Supervisor was restarted"
    fi
}

# Check disk space
check_disk() {
    DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
    if [ "$DISK_USAGE" -gt "$DISK_THRESHOLD" ]; then
        print_error "Disk usage critical: ${DISK_USAGE}%"
        log_message "Disk usage critical: ${DISK_USAGE}%"
        
        # Clean up old logs
        find /var/log -name "*.log" -mtime +30 -delete 2>/dev/null || true
        find /var/log -name "*.gz" -mtime +30 -delete 2>/dev/null || true
    else
        print_status "Disk usage: ${DISK_USAGE}%"
    fi
}

# Check memory usage
check_memory() {
    MEMORY_USAGE=$(free | awk 'NR==2 {printf "%.0f", $3*100/$2}')
    if [ "$MEMORY_USAGE" -gt "$MEMORY_THRESHOLD" ]; then
        print_warning "Memory usage high: ${MEMORY_USAGE}%"
        log_message "Memory usage high: ${MEMORY_USAGE}%"
    else
        print_status "Memory usage: ${MEMORY_USAGE}%"
    fi
}

# Check Nginx error log
check_nginx_errors() {
    if [ -f /var/log/nginx/error.log ]; then
        ERROR_COUNT=$(grep -c "ERROR\|error\|crit\|alert\|emerg" /var/log/nginx/error.log 2>/dev/null || echo 0)
        if [ "$ERROR_COUNT" -gt "$ERROR_THRESHOLD" ]; then
            print_warning "Nginx has $ERROR_COUNT error entries"
            log_message "Nginx has $ERROR_COUNT error entries"
        else
            print_status "Nginx errors: $ERROR_COUNT (within threshold)"
        fi
    else
        print_status "Nginx error log not found (no errors)"
    fi
}

# Check Laravel application health
check_laravel() {
    cd "$APP_DIR"
    
    # Check if artisan exists
    if [ -f artisan ]; then
        # Test database connection
        DB_STATUS=$(php artisan tinker --execute='echo "connected";' 2>/dev/null || echo "failed")
        if [ "$DB_STATUS" = "connected" ]; then
            print_status "Laravel database connection OK"
        else
            print_error "Laravel database connection failed"
            log_message "Laravel database connection failed"
        fi
        
        # Check cache
        CACHE_STATUS=$(php artisan tinker --execute='echo Cache::get("test") ?? "ok";' 2>/dev/null || echo "failed")
        if [ "$CACHE_STATUS" = "ok" ]; then
            print_status "Laravel cache OK"
        else
            print_warning "Laravel cache may have issues"
        fi
    fi
}

# Check SSL certificate
check_ssl() {
    CERT_FILE="/etc/ssl/certs/exim-erp.crt"
    if [ -f "$CERT_FILE" ]; then
        EXPIRY=$(openssl x509 -enddate -noout -in "$CERT_FILE" 2>/dev/null | cut -d= -f2)
        EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s 2>/dev/null || echo 0)
        CURRENT_EPOCH=$(date +%s)
        DAYS_LEFT=$(( ($EXPIRY_EPOCH - $CURRENT_EPOCH) / 86400 ))
        
        if [ "$DAYS_LEFT" -lt 30 ]; then
            print_warning "SSL certificate expires in $DAYS_LEFT days"
            log_message "SSL certificate expires in $DAYS_LEFT days"
        else
            print_status "SSL certificate valid for $DAYS_LEFT days"
        fi
    else
        print_warning "SSL certificate not found"
    fi
}

# Main execution
echo "=========================================="
echo "EXIM ERP Health Check"
echo "Time: $(date)"
echo "=========================================="
echo ""

check_php_fpm
check_nginx
check_mysql
check_redis
check_supervisor
check_disk
check_memory
check_nginx_errors
check_laravel
check_ssl

echo ""
echo "=========================================="
echo "Health check completed at $(date)"
echo "=========================================="
