#!/bin/bash

# ParentFlow Production Start Script
# Starts all production services including backend, frontend, and admin dashboard

set -e

# Configuration
DEPLOY_DIR="/root/parentflow-production"
DB_HOST="10.0.0.207"
DB_PORT="5432"

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

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

error() {
    echo -e "${RED}[ERROR]${NC} $1" >&2
    exit 1
}

success() {
    echo -e "${GREEN}✓${NC} $1"
}

warning() {
    echo -e "${YELLOW}⚠${NC} $1"
}

# Header
echo ""
echo "=========================================="
echo "   Starting ParentFlow Production        "
echo "=========================================="
echo ""

# Check if we're in the right directory
if [ "$PWD" != "$DEPLOY_DIR" ] && [ -d "$DEPLOY_DIR" ]; then
    cd "$DEPLOY_DIR"
fi

# Step 1: Check database connectivity
log "${CYAN}Step 1: Checking database connectivity...${NC}"
PGPASSWORD=a3ppq psql -h $DB_HOST -p $DB_PORT -U postgres -d parentflow \
    -c "SELECT version();" > /dev/null 2>&1
if [ $? -eq 0 ]; then
    success "Database connection successful"
else
    error "Cannot connect to database at $DB_HOST:$DB_PORT"
fi

# Step 2: Start Docker services
log "${CYAN}Step 2: Starting Docker services...${NC}"
if [ -f "docker-compose.production.yml" ]; then
    if docker compose version &> /dev/null; then
        docker compose -f docker-compose.production.yml up -d
    else
        docker-compose -f docker-compose.production.yml up -d
    fi
    sleep 5
    success "Docker services started (Redis, MongoDB, MinIO)"
else
    warning "Docker compose file not found, skipping..."
fi

# Step 3: Verify Docker services
log "${CYAN}Step 3: Verifying Docker services...${NC}"
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "redis|mongo|minio" || warning "Some Docker services may not be running"

# Step 4: Start PM2 processes
log "${CYAN}Step 4: Starting PM2 application services...${NC}"

# Delete any existing PM2 processes
pm2 delete all 2>/dev/null || true

# Start using ecosystem file
if [ -f "ecosystem.config.js" ]; then
    pm2 start ecosystem.config.js --env production
    success "PM2 services started from ecosystem config"
else
    warning "PM2 ecosystem config not found, starting services manually..."

    # Start Backend API
    log "Starting Backend API..."
    cd "$DEPLOY_DIR/maternal-app/maternal-app-backend"
    pm2 start dist/main.js \
        --name "parentflow-api" \
        --instances 2 \
        --exec-mode cluster \
        --env production \
        --max-memory-restart 500M \
        --error /var/log/parentflow/api-error.log \
        --output /var/log/parentflow/api-out.log \
        --merge-logs \
        --time \
        -- --port 3020

    # Start Frontend
    log "Starting Frontend..."
    cd "$DEPLOY_DIR/maternal-web"
    pm2 start npm \
        --name "parentflow-frontend" \
        --instances 2 \
        --exec-mode cluster \
        --max-memory-restart 400M \
        --error /var/log/parentflow/frontend-error.log \
        --output /var/log/parentflow/frontend-out.log \
        --merge-logs \
        --time \
        -- run start

    # Start Admin Dashboard
    log "Starting Admin Dashboard..."
    cd "$DEPLOY_DIR/parentflow-admin"
    pm2 start npm \
        --name "parentflow-admin" \
        --instances 1 \
        --max-memory-restart 300M \
        --error /var/log/parentflow/admin-error.log \
        --output /var/log/parentflow/admin-out.log \
        --merge-logs \
        --time \
        -- run start
fi

# Save PM2 configuration
pm2 save
pm2 startup systemd -u root --hp /root || true

# Step 5: Wait for services to start
log "${CYAN}Step 5: Waiting for services to initialize...${NC}"
sleep 10

# Step 6: Verify services are running
log "${CYAN}Step 6: Verifying services...${NC}"

verify_service() {
    local name=$1
    local port=$2

    if lsof -i:$port > /dev/null 2>&1; then
        success "$name is running on port $port"
        return 0
    else
        warning "$name is not detected on port $port"
        return 1
    fi
}

# Check each service
ALL_GOOD=true
verify_service "Backend API" 3020 || ALL_GOOD=false
verify_service "Frontend" 3030 || ALL_GOOD=false
verify_service "Admin Dashboard" 3335 || ALL_GOOD=false
verify_service "Redis" 6379 || ALL_GOOD=false
verify_service "MongoDB" 27017 || ALL_GOOD=false
verify_service "MinIO" 9000 || ALL_GOOD=false

# Step 7: Show PM2 status
log "${CYAN}Step 7: PM2 Process Status${NC}"
echo ""
pm2 list
echo ""

# Step 8: Test API health
log "${CYAN}Step 8: Testing API health endpoint...${NC}"
sleep 3
if curl -s -o /dev/null -w "%{http_code}" http://localhost:3020/health | grep -q "200\|401"; then
    success "API is responding"
else
    warning "API health check failed - may still be starting"
fi

# Final summary
echo ""
echo "=========================================="
if [ "$ALL_GOOD" = true ]; then
    echo -e "${GREEN}   All Services Started Successfully!   ${NC}"
else
    echo -e "${YELLOW}   Services Started (Check Warnings)   ${NC}"
fi
echo "=========================================="
echo ""
echo "Service URLs:"
echo "  Backend API:     http://localhost:3020"
echo "  Frontend:        http://localhost:3030"
echo "  Admin Dashboard: http://localhost:3335"
echo "  MinIO Console:   http://localhost:9001"
echo ""
echo "Management Commands:"
echo "  View logs:       pm2 logs"
echo "  Monitor:         pm2 monit"
echo "  List processes:  pm2 list"
echo "  Restart all:     pm2 restart all"
echo "  Stop all:        ./stop-production.sh"
echo ""
echo "Log files:"
echo "  /var/log/parentflow/api-*.log"
echo "  /var/log/parentflow/frontend-*.log"
echo "  /var/log/parentflow/admin-*.log"
echo ""

# Create log directory if it doesn't exist
mkdir -p /var/log/parentflow

log "Services started at $(date)"