#!/bin/bash
set -e

# Pounce Start Script
# Startet Backend und Frontend sauber

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKEND_DIR="$SCRIPT_DIR/backend"
FRONTEND_DIR="$SCRIPT_DIR/frontend"

echo "=========================================="
echo "🚀 Pounce Start Script"
echo "=========================================="

# Farben für Output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Funktion zum Beenden von Prozessen
stop_services() {
    echo ""
    echo -e "${YELLOW}🛑 Beende laufende Prozesse...${NC}"
    
    # Backend (uvicorn) - mehrere Versuche
    pkill -9 -f "uvicorn app.main:app" 2>/dev/null || true
    pkill -9 -f "uvicorn" 2>/dev/null || true
    
    # Frontend (next) - mehrere Versuche
    pkill -9 -f "next start" 2>/dev/null || true
    pkill -9 -f "node.*next" 2>/dev/null || true
    pkill -9 -f "npm start" 2>/dev/null || true
    
    # Port 3000 freigeben (alle Prozesse auf Port 3000)
    lsof -ti:3000 2>/dev/null | xargs kill -9 2>/dev/null || true
    
    # Port 8000 freigeben
    lsof -ti:8000 2>/dev/null | xargs kill -9 2>/dev/null || true
    
    sleep 3
    
    # Prüfen ob Ports frei sind
    if lsof -i:8000 >/dev/null 2>&1; then
        echo -e "${RED}✗ Port 8000 ist noch belegt!${NC}"
        lsof -i:8000
        exit 1
    fi
    
    if lsof -i:3000 >/dev/null 2>&1; then
        echo -e "${RED}✗ Port 3000 ist noch belegt!${NC}"
        lsof -i:3000
        exit 1
    fi
    
    echo -e "${GREEN}✓ Alle Prozesse beendet, Ports frei${NC}"
}

# Funktion zum Starten des Backends
start_backend() {
    echo ""
    echo -e "${YELLOW}🔧 Starte Backend...${NC}"
    
    cd "$BACKEND_DIR"
    
    # Aktiviere Virtual Environment
    if [ ! -d "venv" ]; then
        echo -e "${RED}✗ venv nicht gefunden!${NC}"
        exit 1
    fi
    
    source venv/bin/activate
    
    # Lösche altes Log
    > backend.log
    
    # Starte uvicorn im Hintergrund
    nohup uvicorn app.main:app --host 0.0.0.0 --port 8000 > backend.log 2>&1 &
    BACKEND_PID=$!
    
    echo "Backend PID: $BACKEND_PID"
    
    # Warte und prüfe mehrmals
    for i in {1..10}; do
        sleep 1
        if curl -s http://127.0.0.1:8000/health > /dev/null 2>&1; then
            echo -e "${GREEN}✓ Backend läuft auf Port 8000${NC}"
            return 0
        fi
        echo -n "."
    done
    
    echo ""
    echo -e "${RED}✗ Backend konnte nicht gestartet werden${NC}"
    echo "Letzte 30 Zeilen vom Log:"
    tail -30 backend.log
    exit 1
}

# Funktion zum Starten des Frontends
start_frontend() {
    echo ""
    echo -e "${YELLOW}🎨 Starte Frontend...${NC}"
    
    cd "$FRONTEND_DIR"
    
    # Prüfe ob .next existiert
    if [ ! -d ".next" ]; then
        echo -e "${RED}✗ .next nicht gefunden! Bitte erst 'npm run build' ausführen.${NC}"
        exit 1
    fi
    
    # Lösche altes Log
    > frontend.log
    
    # Starte Frontend im Hintergrund
    PORT=3000 nohup npm start > frontend.log 2>&1 &
    FRONTEND_PID=$!
    
    echo "Frontend PID: $FRONTEND_PID"
    
    # Warte und prüfe mehrmals
    for i in {1..15}; do
        sleep 1
        
        # Prüfe ob Prozess noch läuft
        if ! kill -0 $FRONTEND_PID 2>/dev/null; then
            echo ""
            echo -e "${RED}✗ Frontend-Prozess wurde beendet${NC}"
            echo "Letzte 30 Zeilen vom Log:"
            tail -30 frontend.log
            exit 1
        fi
        
        # Prüfe ob Port offen ist
        if curl -s http://127.0.0.1:3000 > /dev/null 2>&1; then
            echo -e "${GREEN}✓ Frontend läuft auf Port 3000${NC}"
            return 0
        fi
        echo -n "."
    done
    
    echo ""
    echo -e "${RED}✗ Frontend konnte nicht gestartet werden${NC}"
    echo "Letzte 30 Zeilen vom Log:"
    tail -30 frontend.log
    exit 1
}

# Funktion für Status-Anzeige
show_status() {
    echo ""
    echo "=========================================="
    echo -e "${GREEN}✓ Pounce erfolgreich gestartet!${NC}"
    echo "=========================================="
    echo ""
    echo "URLs:"
    echo "  Backend:  http://127.0.0.1:8000"
    echo "  Frontend: http://127.0.0.1:3000"
    echo "  Health:   http://127.0.0.1:8000/health"
    echo ""
    echo "Logs:"
    echo "  Backend:  tail -f $BACKEND_DIR/backend.log"
    echo "  Frontend: tail -f $FRONTEND_DIR/frontend.log"
    echo ""
    echo "Laufende Prozesse:"
    ps aux | grep -E "(uvicorn|next start)" | grep -v grep | awk '{print "  PID " $2 ": " $11 " " $12 " " $13}'
    echo ""
    echo "Ports:"
    lsof -i:8000 -i:3000 2>/dev/null | grep LISTEN || echo "  Keine Port-Info verfügbar"
    echo ""
}

# Funktion zum Testen der Services
test_services() {
    echo ""
    echo -e "${YELLOW}🧪 Teste Services...${NC}"
    
    # Test Backend Health
    HEALTH=$(curl -s http://127.0.0.1:8000/health | grep -o '"status":"healthy"' || echo "")
    if [ -n "$HEALTH" ]; then
        echo -e "${GREEN}✓ Backend Health Check OK${NC}"
    else
        echo -e "${RED}✗ Backend Health Check FAILED${NC}"
    fi
    
    # Test Frontend
    HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:3000)
    if [ "$HTTP_CODE" = "200" ]; then
        echo -e "${GREEN}✓ Frontend HTTP 200 OK${NC}"
    else
        echo -e "${RED}✗ Frontend HTTP $HTTP_CODE${NC}"
    fi
    
    # Test OAuth Providers
    OAUTH=$(curl -s http://127.0.0.1:8000/api/v1/oauth/providers | grep -o '"google_enabled":true' || echo "")
    if [ -n "$OAUTH" ]; then
        echo -e "${GREEN}✓ OAuth Providers OK${NC}"
    else
        echo -e "${YELLOW}⚠ OAuth Check konnte nicht durchgeführt werden${NC}"
    fi
}

# Main
stop_services
start_backend
start_frontend
test_services
show_status

echo -e "${GREEN}🎉 Alles läuft!${NC}"
echo ""
echo "Zum Stoppen: pkill -f 'uvicorn' && pkill -f 'next start'"
