#!/bin/bash

# Development Environment Validation Script
# Checks that .env configuration is correct for development environment
#
# Usage:
#   ./scripts/validate-dev-environment.sh
#   ./scripts/validate-dev-environment.sh --fix  # Auto-fix issues

set -e

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

# Change to project root
cd "$(dirname "$0")/.."

# Auto-fix mode
AUTO_FIX=false
if [ "$1" = "--fix" ]; then
    AUTO_FIX=true
fi

echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}  Development Environment Validation${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""

# Track issues
ISSUES_FOUND=0
CRITICAL_ISSUES=0
WARNINGS=0

# Check .env file exists
if [ ! -f ".env" ]; then
    echo -e "${RED}✗ CRITICAL: .env file not found${NC}"
    echo -e "  ${YELLOW}Create .env from .env.example:${NC}"
    echo -e "  cp .env.example .env"
    echo -e "  php artisan key:generate"
    echo ""
    exit 1
fi

echo -e "${GREEN}✓${NC} .env file exists"
echo ""

# Function to check environment variable
check_env_var() {
    local VAR_NAME=$1
    local EXPECTED_VALUE=$2
    local SEVERITY=$3  # "critical", "warning", "info"
    local DESCRIPTION=$4

    local ACTUAL_VALUE=$(grep "^${VAR_NAME}=" .env | cut -d '=' -f2- | tr -d '"' || echo "")

    if [ "$ACTUAL_VALUE" = "$EXPECTED_VALUE" ]; then
        echo -e "${GREEN}✓${NC} ${VAR_NAME}=${ACTUAL_VALUE} ${GREEN}(correct)${NC}"
        return 0
    else
        if [ "$SEVERITY" = "critical" ]; then
            echo -e "${RED}✗ ${VAR_NAME}=${ACTUAL_VALUE} ${RED}(should be: ${EXPECTED_VALUE})${NC}"
            echo -e "  ${YELLOW}Issue: ${DESCRIPTION}${NC}"
            CRITICAL_ISSUES=$((CRITICAL_ISSUES + 1))
        elif [ "$SEVERITY" = "warning" ]; then
            echo -e "${YELLOW}⚠ ${VAR_NAME}=${ACTUAL_VALUE} ${YELLOW}(should be: ${EXPECTED_VALUE})${NC}"
            echo -e "  ${YELLOW}Warning: ${DESCRIPTION}${NC}"
            WARNINGS=$((WARNINGS + 1))
        fi

        ISSUES_FOUND=$((ISSUES_FOUND + 1))

        if [ "$AUTO_FIX" = true ]; then
            echo -e "  ${BLUE}Fixing: Setting ${VAR_NAME}=${EXPECTED_VALUE}${NC}"
            if grep -q "^${VAR_NAME}=" .env; then
                sed -i '' "s/^${VAR_NAME}=.*/${VAR_NAME}=${EXPECTED_VALUE}/" .env
            else
                echo "${VAR_NAME}=${EXPECTED_VALUE}" >> .env
            fi
            echo -e "  ${GREEN}✓ Fixed${NC}"
        fi

        echo ""
        return 1
    fi
}

# Function to check environment variable exists
check_env_exists() {
    local VAR_NAME=$1
    local DESCRIPTION=$2

    if grep -q "^${VAR_NAME}=" .env; then
        local VALUE=$(grep "^${VAR_NAME}=" .env | cut -d '=' -f2- | tr -d '"')
        echo -e "${GREEN}✓${NC} ${VAR_NAME} is set (${VALUE})"
        return 0
    else
        echo -e "${RED}✗ ${VAR_NAME} is not set${NC}"
        echo -e "  ${YELLOW}${DESCRIPTION}${NC}"
        CRITICAL_ISSUES=$((CRITICAL_ISSUES + 1))
        ISSUES_FOUND=$((ISSUES_FOUND + 1))
        echo ""
        return 1
    fi
}

# Function to check environment variable NOT set to a value
check_env_not_value() {
    local VAR_NAME=$1
    local BAD_VALUE=$2
    local SEVERITY=$3
    local DESCRIPTION=$4

    local ACTUAL_VALUE=$(grep "^${VAR_NAME}=" .env | cut -d '=' -f2- | tr -d '"' || echo "")

    if [ "$ACTUAL_VALUE" != "$BAD_VALUE" ]; then
        echo -e "${GREEN}✓${NC} ${VAR_NAME}=${ACTUAL_VALUE} ${GREEN}(not ${BAD_VALUE})${NC}"
        return 0
    else
        if [ "$SEVERITY" = "critical" ]; then
            echo -e "${RED}✗ ${VAR_NAME}=${ACTUAL_VALUE} ${RED}(should NOT be ${BAD_VALUE})${NC}"
            CRITICAL_ISSUES=$((CRITICAL_ISSUES + 1))
        else
            echo -e "${YELLOW}⚠ ${VAR_NAME}=${ACTUAL_VALUE} ${YELLOW}(should NOT be ${BAD_VALUE})${NC}"
            WARNINGS=$((WARNINGS + 1))
        fi

        echo -e "  ${YELLOW}${DESCRIPTION}${NC}"
        ISSUES_FOUND=$((ISSUES_FOUND + 1))
        echo ""
        return 1
    fi
}

echo -e "${YELLOW}Checking Application Configuration...${NC}"
echo ""

# APP_ENV should be "local" for development
check_env_var "APP_ENV" "local" "critical" \
    "APP_ENV=TEST affects logging and error handling. Use 'local' for development."

# APP_DEBUG should be true for development
check_env_var "APP_DEBUG" "true" "critical" \
    "APP_DEBUG=false hides detailed error messages. Use 'true' for development."

# APP_URL should be localhost
check_env_not_value "APP_URL" "http://showprima.com" "warning" \
    "APP_URL should point to localhost for development, not production."

echo ""
echo -e "${YELLOW}Checking Database Configuration...${NC}"
echo ""

# Database connection should be mysql
check_env_var "DB_CONNECTION" "mysql" "critical" \
    "This project uses MySQL for development (production parity)."

# Database host
check_env_var "DB_HOST" "127.0.0.1" "warning" \
    "Database host should be 127.0.0.1 for local development."

# Database port
check_env_var "DB_PORT" "3306" "info" \
    "Standard MySQL port is 3306."

# Database name
check_env_not_value "DB_DATABASE" "showprima_test" "warning" \
    "DB_DATABASE should be 'showprima_dev' for development, not 'showprima_test'."

# Database credentials exist
check_env_exists "DB_USERNAME" "Database username is required."
check_env_exists "DB_PASSWORD" "Database password is required."

echo ""
echo -e "${YELLOW}Checking Mail Configuration...${NC}"
echo ""

# Mail driver should be smtp for local Mailpit
check_env_var "MAIL_MAILER" "smtp" "warning" \
    "MAIL_MAILER should be 'smtp' for Mailpit integration."

# Mailpit uses localhost:1025
MAIL_HOST=$(grep "^MAIL_HOST=" .env | cut -d '=' -f2- | tr -d '"' || echo "")
if [ "$MAIL_HOST" = "localhost" ] || [ "$MAIL_HOST" = "127.0.0.1" ]; then
    echo -e "${GREEN}✓${NC} MAIL_HOST=${MAIL_HOST} ${GREEN}(correct for Mailpit)${NC}"
else
    echo -e "${YELLOW}⚠ MAIL_HOST=${MAIL_HOST} ${YELLOW}(should be localhost or 127.0.0.1 for Mailpit)${NC}"
    WARNINGS=$((WARNINGS + 1))
    ISSUES_FOUND=$((ISSUES_FOUND + 1))
fi

MAIL_PORT=$(grep "^MAIL_PORT=" .env | cut -d '=' -f2- | tr -d '"' || echo "")
if [ "$MAIL_PORT" = "1025" ]; then
    echo -e "${GREEN}✓${NC} MAIL_PORT=${MAIL_PORT} ${GREEN}(correct for Mailpit)${NC}"
else
    echo -e "${YELLOW}⚠ MAIL_PORT=${MAIL_PORT} ${YELLOW}(should be 1025 for Mailpit)${NC}"
    WARNINGS=$((WARNINGS + 1))
    ISSUES_FOUND=$((ISSUES_FOUND + 1))
fi

echo ""
echo -e "${YELLOW}Checking Queue Configuration...${NC}"
echo ""

# Queue connection should be database
check_env_var "QUEUE_CONNECTION" "database" "critical" \
    "QUEUE_CONNECTION should be 'database' for queue-based email system."

echo ""
echo -e "${YELLOW}Checking Services...${NC}"
echo ""

# Check MySQL connection
if command -v mysql &> /dev/null; then
    if mysql --host="$(grep '^DB_HOST=' .env | cut -d'=' -f2 | tr -d '"')" \
             --port="$(grep '^DB_PORT=' .env | cut -d'=' -f2 | tr -d '"')" \
             --user="$(grep '^DB_USERNAME=' .env | cut -d'=' -f2 | tr -d '"')" \
             --password="$(grep '^DB_PASSWORD=' .env | cut -d'=' -f2 | tr -d '"')" \
             --database="$(grep '^DB_DATABASE=' .env | cut -d'=' -f2 | tr -d '"')" \
             -e "SELECT 1" > /dev/null 2>&1; then
        echo -e "${GREEN}✓${NC} MySQL connection successful"
    else
        echo -e "${RED}✗ MySQL connection failed${NC}"
        echo -e "  ${YELLOW}Check DB_* credentials in .env${NC}"
        CRITICAL_ISSUES=$((CRITICAL_ISSUES + 1))
        ISSUES_FOUND=$((ISSUES_FOUND + 1))
    fi
else
    echo -e "${YELLOW}⚠ mysql command not found (install MySQL client)${NC}"
    WARNINGS=$((WARNINGS + 1))
fi

# Check Mailpit
if lsof -i :8025 > /dev/null 2>&1; then
    echo -e "${GREEN}✓${NC} Mailpit is running on port 8025"
else
    echo -e "${YELLOW}⚠ Mailpit is not running${NC}"
    echo -e "  ${YELLOW}Start with: mailpit${NC}"
    echo -e "  ${YELLOW}Or install: brew install mailpit${NC}"
    WARNINGS=$((WARNINGS + 1))
fi

# Check queue worker
if pgrep -f "queue:work" > /dev/null; then
    echo -e "${GREEN}✓${NC} Queue worker is running"
else
    echo -e "${YELLOW}⚠ Queue worker is not running${NC}"
    echo -e "  ${YELLOW}Emails will not send until queue worker starts!${NC}"
    echo -e "  ${YELLOW}Start with: ./scripts/start-queue-worker.sh${NC}"
    WARNINGS=$((WARNINGS + 1))
fi

echo ""
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}  Validation Summary${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""

if [ $CRITICAL_ISSUES -eq 0 ] && [ $WARNINGS -eq 0 ]; then
    echo -e "${GREEN}✓ All checks passed!${NC}"
    echo -e "${GREEN}Your development environment is correctly configured.${NC}"
    echo ""
    exit 0
else
    echo -e "${YELLOW}Issues Found:${NC}"
    echo -e "  ${RED}Critical: $CRITICAL_ISSUES${NC}"
    echo -e "  ${YELLOW}Warnings: $WARNINGS${NC}"
    echo -e "  ${BLUE}Total: $ISSUES_FOUND${NC}"
    echo ""

    if [ $CRITICAL_ISSUES -gt 0 ]; then
        echo -e "${RED}⚠ Critical issues must be fixed before development!${NC}"
        echo ""

        if [ "$AUTO_FIX" = false ]; then
            echo -e "${YELLOW}Quick Fix Options:${NC}"
            echo -e "  1. Run with --fix flag: ${BLUE}./scripts/validate-dev-environment.sh --fix${NC}"
            echo -e "  2. Manually edit .env file"
            echo ""
        fi

        exit 1
    else
        echo -e "${YELLOW}⚠ No critical issues, but warnings should be addressed.${NC}"
        echo ""
        exit 0
    fi
fi
