#!/bin/bash
# ═══════════════════════════════════════════════════════
# proj — Projector Management Tool
# Alias: proj → ~/Documents/Antigravity/Projector/proj.sh
# ═══════════════════════════════════════════════════════

PROJECTOR_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
PROJECTS_DIR="$HOME/Documents/Projector/Projects"
PORT=3000
SESSION="projector-server"
GEMINI_BASE_CMD="gemini -y -s false --include-directories ~/.gemini"

# Dostupné modely
AUTO_MODELS_3=("gemini-3.1-pro" "gemini-3-flash")
AUTO_MODELS_25=("gemini-2.5-pro" "gemini-2.5-flash")
MANUAL_MODELS=("gemini-3.1-pro-preview" "gemini-3-flash-preview" "gemini-2.5-pro" "gemini-2.5-flash" "gemini-2.5-flash-lite")

# ─── Barvy ───
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
BOLD='\033[1m'
DIM='\033[2m'
NC='\033[0m'

# ═══════════════════════════════════════════════════════
# Funkce
# ═══════════════════════════════════════════════════════

server_is_running() {
    screen -list 2>/dev/null | grep -q "$SESSION"
}

server_status() {
    if server_is_running; then
        echo -e "${GREEN}●${NC} Server běží ${DIM}(screen: $SESSION, port: $PORT)${NC}"
    else
        echo -e "${RED}●${NC} Server neběží"
    fi
}

server_start() {
    # Kill existující session
    if server_is_running; then
        echo -e "${YELLOW}⚠${NC}  Server už běží — restartuji..."
        screen -S "$SESSION" -X quit 2>/dev/null
        sleep 1
    fi

    # Kill proces na portu
    local PID
    PID=$(lsof -t -i :$PORT 2>/dev/null)
    if [ -n "$PID" ]; then
        echo -e "${DIM}Killuju proces na portu $PORT (PID: $PID)...${NC}"
        kill $PID 2>/dev/null
        sleep 1
        PID=$(lsof -t -i :$PORT 2>/dev/null)
        [ -n "$PID" ] && kill -9 $PID 2>/dev/null
    fi

    # Rotace logu
    local LOGFILE="$PROJECTOR_DIR/server.log"
    [ -f "$LOGFILE" ] && mv "$LOGFILE" "${LOGFILE}.prev"

    # Spuštění
    screen -dmS "$SESSION" bash -c "cd '$PROJECTOR_DIR' && PORT=$PORT node server/index.js 2>&1 | tee '$LOGFILE'"
    sleep 2

    if lsof -i :$PORT > /dev/null 2>&1; then
        echo -e "${GREEN}✅${NC} Server běží na portu ${BOLD}$PORT${NC}"
    else
        echo -e "${RED}❌${NC} Chyba při spouštění. Zkontroluj: ${CYAN}screen -r $SESSION${NC}"
    fi
}

server_stop() {
    if server_is_running; then
        screen -S "$SESSION" -X quit 2>/dev/null
        sleep 1
    fi

    local PID
    PID=$(lsof -t -i :$PORT 2>/dev/null)
    if [ -n "$PID" ]; then
        kill $PID 2>/dev/null
        sleep 1
        PID=$(lsof -t -i :$PORT 2>/dev/null)
        [ -n "$PID" ] && kill -9 $PID 2>/dev/null
    fi

    echo -e "${RED}🛑${NC} Server zastaven"
}

server_restart() {
    echo -e "${YELLOW}🔄${NC} Restartuji server..."
    server_stop
    server_start
}

get_current_model() {
    # Přečti aktuálně nastavený model ze settings.json
    if command -v python3 &>/dev/null && [ -f "$HOME/.gemini/settings.json" ]; then
        python3 -c "import json; d=json.load(open('$HOME/.gemini/settings.json')); print(d.get('model',{}).get('name','unknown'))" 2>/dev/null
    else
        echo "unknown"
    fi
}

select_model() {
    local current_model
    current_model=$(get_current_model)

    echo ""
    echo -e "${BOLD}🤖 Select Model${NC}"
    echo ""
    echo -e "  ${CYAN}1)${NC} ${BOLD}Auto (Gemini 3)${NC}"
    echo -e "     ${DIM}Nechá CLI vybrat: ${AUTO_MODELS_3[*]}${NC}"
    echo -e "  ${CYAN}2)${NC} ${BOLD}Auto (Gemini 2.5)${NC}"
    echo -e "     ${DIM}Nechá CLI vybrat: ${AUTO_MODELS_25[*]}${NC}"
    echo -e "  ${GREEN}●${NC} ${CYAN}3)${NC} ${BOLD}Manual${NC} ${DIM}($current_model)${NC}"
    echo -e "     ${DIM}Vybrat konkrétní model${NC}"
    echo ""
    echo -ne "${DIM}Vyber (Enter = Manual/$current_model):${NC} "
    read -r model_choice

    case "$model_choice" in
        1)
            SELECTED_MODEL=""
            GEMINI_MODEL_ARG=""
            echo -e "${GREEN}✓${NC} Auto (Gemini 3)"
            ;;
        2)
            SELECTED_MODEL=""
            GEMINI_MODEL_ARG=""
            echo -e "${GREEN}✓${NC} Auto (Gemini 2.5)"
            ;;
        3|"")
            select_manual_model "$current_model"
            ;;
        *)
            echo -e "${RED}❌${NC} Neplatná volba"
            exit 1
            ;;
    esac
}

select_manual_model() {
    local current_model="$1"

    echo ""
    echo -e "${BOLD}🤖 Select Model${NC}"
    echo ""

    local i=1
    for model in "${MANUAL_MODELS[@]}"; do
        if [ "$model" = "$current_model" ]; then
            echo -e "  ${GREEN}●${NC} ${CYAN}$i)${NC} ${BOLD}$model${NC}"
        else
            echo -e "    ${CYAN}$i)${NC} $model"
        fi
        ((i++))
    done

    echo ""
    echo -ne "${DIM}Vyber číslo (Enter = $current_model):${NC} "
    read -r manual_choice

    if [ -z "$manual_choice" ]; then
        SELECTED_MODEL="$current_model"
    elif [[ "$manual_choice" =~ ^[0-9]+$ ]] && [ "$manual_choice" -ge 1 ] && [ "$manual_choice" -le "${#MANUAL_MODELS[@]}" ]; then
        SELECTED_MODEL="${MANUAL_MODELS[$((manual_choice-1))]}"
    else
        echo -e "${RED}❌${NC} Neplatná volba"
        exit 1
    fi

    GEMINI_MODEL_ARG="-m $SELECTED_MODEL"
    echo -e "${GREEN}✓${NC} Model: ${BOLD}$SELECTED_MODEL${NC}"
}

cli_launch() {
    local target_dir="$1"

    # Výběr modelu
    select_model

    echo -e "${CYAN}💻${NC} Spouštím Gemini CLI v: ${BOLD}$target_dir${NC}"
    cd "$target_dir" || exit 1
    $GEMINI_BASE_CMD $GEMINI_MODEL_ARG
}

cli_menu() {
    echo ""
    echo -e "${BOLD}💻 Gemini CLI — vyber projekt:${NC}"
    echo ""
    echo -e "  ${CYAN}0)${NC} ${BOLD}Projector${NC} ${DIM}(tento projekt)${NC}"

    # Načti projekty
    local projects=()
    local i=1
    if [ -d "$PROJECTS_DIR" ]; then
        while IFS= read -r dir; do
            projects+=("$dir")
            echo -e "  ${CYAN}$i)${NC} $(basename "$dir")"
            ((i++))
        done < <(find "$PROJECTS_DIR" -mindepth 1 -maxdepth 1 -type d -not -name '.*' | sort)
    fi

    echo ""
    echo -ne "${DIM}Vyber číslo (Enter = Projector):${NC} "
    read -r choice

    if [ -z "$choice" ] || [ "$choice" = "0" ]; then
        cli_launch "$PROJECTOR_DIR"
    elif [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le "${#projects[@]}" ]; then
        cli_launch "${projects[$((choice-1))]}"
    else
        echo -e "${RED}❌${NC} Neplatná volba"
        exit 1
    fi
}

show_help() {
    echo ""
    echo -e "${BOLD}📖 proj — Projector Management Tool${NC}"
    echo -e "${DIM}═══════════════════════════════════════${NC}"
    echo ""
    echo -e "${BOLD}Použití:${NC}"
    echo -e "  ${CYAN}proj${NC}                    Interaktivní menu"
    echo -e "  ${CYAN}proj ${BOLD}start${NC}              Spustí server (restart pokud běží)"
    echo -e "  ${CYAN}proj ${BOLD}stop${NC}               Zastaví server"
    echo -e "  ${CYAN}proj ${BOLD}restart${NC}            Restart serveru"
    echo -e "  ${CYAN}proj ${BOLD}status${NC}             Stav serveru"
    echo -e "  ${CYAN}proj ${BOLD}cli${NC}                Gemini CLI v Projectoru"
    echo -e "  ${CYAN}proj ${BOLD}cli ${NC}${DIM}<projekt>${NC}      Gemini CLI v konkrétním projektu"
    echo -e "  ${CYAN}proj ${BOLD}cli list${NC}           Seznam projektů"
    echo -e "  ${CYAN}proj ${BOLD}/h${NC}                 Tato nápověda"
    echo ""
    echo -e "${BOLD}Server:${NC}"
    echo -e "  Běží v GNU Screen session ${CYAN}$SESSION${NC} na portu ${CYAN}$PORT${NC}."
    echo -e "  Připojení k logu: ${CYAN}screen -r $SESSION${NC}"
    echo -e "  Odpojení z logu:  ${CYAN}Ctrl+A D${NC}"
    echo ""
    echo -e "${BOLD}Projekty:${NC}"
    echo -e "  Hledá složky v: ${CYAN}$PROJECTS_DIR${NC}"
    echo -e "  Gemini CLI spouští: ${DIM}$GEMINI_BASE_CMD${NC}"
    echo -e "  Při spuštění se zeptá na model (Auto/Manual)"
    echo ""
}

show_menu() {
    echo ""
    echo -e "${BOLD}⚡ Projector${NC}"
    server_status
    echo ""
    echo -e "  ${CYAN}1)${NC} 🚀 Start serveru"
    echo -e "  ${CYAN}2)${NC} 🛑 Stop serveru"
    echo -e "  ${CYAN}3)${NC} 🔄 Restart serveru"
    echo -e "  ${CYAN}4)${NC} 💻 Gemini CLI"
    echo -e "  ${CYAN}5)${NC} 📖 Help"
    echo ""
    echo -ne "${DIM}Vyber (1-5):${NC} "
    read -r choice

    case "$choice" in
        1) server_start ;;
        2) server_stop ;;
        3) server_restart ;;
        4) cli_menu ;;
        5) show_help ;;
        *) echo -e "${RED}❌${NC} Neplatná volba" ;;
    esac
}

# ═══════════════════════════════════════════════════════
# Hlavní logika — zpracování parametrů
# ═══════════════════════════════════════════════════════

case "$1" in
    start)
        server_start
        ;;
    stop)
        server_stop
        ;;
    restart)
        server_restart
        ;;
    status)
        server_status
        ;;
    cli)
        if [ "$2" = "list" ]; then
            echo -e "${BOLD}📂 Projekty v $PROJECTS_DIR:${NC}"
            echo "────────────────────────────────"
            ls -F "$PROJECTS_DIR" 2>/dev/null | grep "/$" | sed 's/\///'
        elif [ -n "$2" ]; then
            TARGET_DIR="$PROJECTS_DIR/$2"
            if [ -d "$TARGET_DIR" ]; then
                cli_launch "$TARGET_DIR"
            else
                echo -e "${RED}❌${NC} Projekt '$2' neexistuje v $PROJECTS_DIR"
                exit 1
            fi
        else
            cli_launch "$PROJECTOR_DIR"
        fi
        ;;
    /h|/help|--help|-h)
        show_help
        ;;
    "")
        show_menu
        ;;
    *)
        echo -e "${RED}❌${NC} Neznámý příkaz: $1"
        echo -e "${DIM}Použij 'proj /h' pro nápovědu${NC}"
        exit 1
        ;;
esac
