#!/bin/bash

# Enamel Wallet - Environment Validation Script
# This script checks if all required environment files and configurations are properly set up

echo "🔍 Enamel Wallet - Environment Configuration Check"
echo "=================================================="
echo ""

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

ERRORS=0
WARNINGS=0

# Function to check file exists
check_file() {
    if [ -f "$1" ]; then
        echo -e "${GREEN}✓${NC} $2"
        return 0
    else
        echo -e "${RED}✗${NC} $2"
        ERRORS=$((ERRORS + 1))
        return 1
    fi
}

# Function to check directory exists
check_dir() {
    if [ -d "$1" ]; then
        echo -e "${GREEN}✓${NC} $2"
        return 0
    else
        echo -e "${RED}✗${NC} $2"
        ERRORS=$((ERRORS + 1))
        return 1
    fi
}

# Function to check env variable in file
check_env_var() {
    local file=$1
    local var=$2
    local description=$3
    
    if grep -q "^${var}=" "$file" 2>/dev/null; then
        local value=$(grep "^${var}=" "$file" | cut -d'=' -f2)
        if [[ -z "$value" || "$value" == "your-"* || "$value" == "YOUR_"* ]]; then
            echo -e "  ${YELLOW}⚠${NC} $var is set but needs configuration"
            WARNINGS=$((WARNINGS + 1))
        else
            echo -e "  ${GREEN}✓${NC} $var is configured"
        fi
    else
        echo -e "  ${RED}✗${NC} $var is missing"
        ERRORS=$((ERRORS + 1))
    fi
}

echo -e "${BLUE}1. Checking Required Files...${NC}"
echo ""

check_file ".env" "Frontend .env file"
check_file "backend/.env" "Backend .env file"
check_file "backend/src/database/schema.sql" "Database schema file" || check_file "DATABASE_SCHEMA.sql" "Database schema file (root)"

echo ""
echo -e "${BLUE}2. Checking Node Modules...${NC}"
echo ""

check_dir "node_modules" "Frontend dependencies installed"
check_dir "backend/node_modules" "Backend dependencies installed"

echo ""
echo -e "${BLUE}3. Checking Frontend Configuration (.env)...${NC}"
echo ""

if [ -f ".env" ]; then
    check_env_var ".env" "VITE_API_URL" "API URL"
    
    # Check if API URL is set correctly
    if grep -q "VITE_API_URL=http://localhost:5000/api" ".env" 2>/dev/null; then
        echo -e "  ${GREEN}✓${NC} API URL points to Node.js backend"
    else
        api_url=$(grep "VITE_API_URL" ".env" | cut -d'=' -f2)
        echo -e "  ${YELLOW}⚠${NC} API URL is: $api_url (expected: http://localhost:5000/api for dev)"
        WARNINGS=$((WARNINGS + 1))
    fi
else
    echo -e "  ${RED}✗${NC} .env file not found"
fi

echo ""
echo -e "${BLUE}4. Checking Backend Configuration (backend/.env)...${NC}"
echo ""

if [ -f "backend/.env" ]; then
    check_env_var "backend/.env" "PORT" "Server port"
    check_env_var "backend/.env" "DB_HOST" "Database host"
    check_env_var "backend/.env" "DB_NAME" "Database name"
    check_env_var "backend/.env" "DB_USER" "Database user"
    check_env_var "backend/.env" "DB_PASSWORD" "Database password"
    check_env_var "backend/.env" "JWT_SECRET" "JWT secret"
    check_env_var "backend/.env" "CORS_ORIGIN" "CORS origin"
else
    echo -e "  ${RED}✗${NC} backend/.env file not found"
fi

echo ""
echo -e "${BLUE}5. Checking Optional Integrations (backend/.env)...${NC}"
echo ""

if [ -f "backend/.env" ]; then
    # Paystack
    if grep -q "^PAYSTACK_SECRET_KEY=" "backend/.env" 2>/dev/null; then
        local paystack=$(grep "^PAYSTACK_SECRET_KEY=" "backend/.env" | cut -d'=' -f2)
        if [[ "$paystack" == "sk_test_"* || "$paystack" == "sk_live_"* ]]; then
            echo -e "  ${GREEN}✓${NC} Paystack configured"
        else
            echo -e "  ${YELLOW}⚠${NC} Paystack needs configuration"
            WARNINGS=$((WARNINGS + 1))
        fi
    else
        echo -e "  ${YELLOW}⚠${NC} Paystack not configured"
        WARNINGS=$((WARNINGS + 1))
    fi
    
    # Prembly
    if grep -q "^PREMBLY_API_KEY=" "backend/.env" 2>/dev/null; then
        local prembly=$(grep "^PREMBLY_API_KEY=" "backend/.env" | cut -d'=' -f2)
        if [[ ! -z "$prembly" && "$prembly" != "your-"* ]]; then
            echo -e "  ${GREEN}✓${NC} Prembly KYC configured"
        else
            echo -e "  ${YELLOW}⚠${NC} Prembly KYC needs configuration"
            WARNINGS=$((WARNINGS + 1))
        fi
    else
        echo -e "  ${YELLOW}⚠${NC} Prembly KYC not configured"
        WARNINGS=$((WARNINGS + 1))
    fi
fi

echo ""
echo -e "${BLUE}6. Checking Database Connection...${NC}"
echo ""

# Check if PostgreSQL is running
if command -v pg_isready &> /dev/null; then
    if pg_isready &> /dev/null; then
        echo -e "  ${GREEN}✓${NC} PostgreSQL is running"
        
        # Check if database exists
        if [ -f "backend/.env" ]; then
            DB_NAME=$(grep "^DB_NAME=" "backend/.env" | cut -d'=' -f2)
            if psql -lqt 2>/dev/null | cut -d \| -f 1 | grep -qw "$DB_NAME"; then
                echo -e "  ${GREEN}✓${NC} Database '$DB_NAME' exists"
            else
                echo -e "  ${RED}✗${NC} Database '$DB_NAME' does not exist"
                echo -e "      Run: ${YELLOW}createdb $DB_NAME${NC}"
                ERRORS=$((ERRORS + 1))
            fi
        fi
    else
        echo -e "  ${RED}✗${NC} PostgreSQL is not running"
        echo -e "      Start PostgreSQL to continue"
        ERRORS=$((ERRORS + 1))
    fi
else
    echo -e "  ${YELLOW}⚠${NC} PostgreSQL tools not found in PATH"
    echo -e "      Cannot verify database status"
    WARNINGS=$((WARNINGS + 1))
fi

echo ""
echo -e "${BLUE}7. Checking Port Availability...${NC}"
echo ""

# Check if port 5000 is available
if command -v lsof &> /dev/null; then
    if lsof -Pi :5000 -sTCP:LISTEN -t >/dev/null 2>&1; then
        echo -e "  ${YELLOW}⚠${NC} Port 5000 is already in use"
        echo -e "      Backend may already be running or port is occupied"
        WARNINGS=$((WARNINGS + 1))
    else
        echo -e "  ${GREEN}✓${NC} Port 5000 is available"
    fi
    
    # Check if port 5173 is available
    if lsof -Pi :5173 -sTCP:LISTEN -t >/dev/null 2>&1; then
        echo -e "  ${YELLOW}⚠${NC} Port 5173 is already in use"
        echo -e "      Frontend may already be running or port is occupied"
        WARNINGS=$((WARNINGS + 1))
    else
        echo -e "  ${GREEN}✓${NC} Port 5173 is available"
    fi
else
    echo -e "  ${YELLOW}⚠${NC} Cannot check port availability (lsof not found)"
    WARNINGS=$((WARNINGS + 1))
fi

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

if [ $ERRORS -eq 0 ] && [ $WARNINGS -eq 0 ]; then
    echo -e "${GREEN}✓ All checks passed!${NC}"
    echo ""
    echo "Your environment is properly configured."
    echo "You can start development with: ./start-dev.sh"
elif [ $ERRORS -eq 0 ]; then
    echo -e "${YELLOW}⚠ $WARNINGS warning(s) found${NC}"
    echo ""
    echo "Your environment is mostly configured, but some optional"
    echo "features may not work until you add the required API keys."
    echo ""
    echo "You can start development, but update these configurations:"
    echo "  - Paystack API key (for payments)"
    echo "  - Prembly API key (for KYC verification)"
else
    echo -e "${RED}✗ $ERRORS error(s) and $WARNINGS warning(s) found${NC}"
    echo ""
    echo "Please fix the errors above before starting development."
    echo ""
    echo "Quick fixes:"
    echo "  1. Missing .env files: cp env.example .env && cp backend/.env.example backend/.env"
    echo "  2. Missing dependencies: npm install && cd backend && npm install"
    echo "  3. Missing database: createdb enamel_wallet && psql -d enamel_wallet -f DATABASE_SCHEMA.sql"
fi

echo ""

exit $ERRORS
