#!/bin/bash

# SaveInMed Development Startup Script
# Permite iniciar um ou mais serviços do projeto

# Cores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# Diretório raiz do projeto
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# Função para exibir o banner
show_banner() {
    echo -e "${CYAN}"
    echo "╔══════════════════════════════════════════════════╗"
    echo "║                                                  ║"
    echo "║   ███████  █████  ██    ██ ███████ ██ ███    ██  ║"
    echo "║   ██      ██   ██ ██    ██ ██      ██ ████   ██  ║"
    echo "║   ███████ ███████ ██    ██ █████   ██ ██ ██  ██  ║"
    echo "║        ██ ██   ██  ██  ██  ██      ██ ██  ██ ██  ║"
    echo "║   ███████ ██   ██   ████   ███████ ██ ██   ████  ║"
    echo "║                                                  ║"
    echo "║   ███    ███ ███████ ██████                      ║"
    echo "║   ████  ████ ██      ██   ██                     ║"
    echo "║   ██ ████ ██ █████   ██   ██                     ║"
    echo "║   ██  ██  ██ ██      ██   ██                     ║"
    echo "║   ██      ██ ███████ ██████                      ║"
    echo "║                                                  ║"
    echo "║          Development Startup Script              ║"
    echo "║                                                  ║"
    echo "╚══════════════════════════════════════════════════╝"
    echo -e "${NC}"
}

# Função para verificar dependências
check_dependency() {
    local cmd=$1
    local name=$2
    if command -v "$cmd" &> /dev/null; then
        echo -e "  ${GREEN}✓${NC} $name"
        return 0
    else
        echo -e "  ${RED}✗${NC} $name (não instalado)"
        return 1
    fi
}

# Função para instalar Go
install_go() {
    echo -e "${YELLOW}📦 Instalando Go...${NC}"
    curl -fsSL https://go.dev/dl/go1.24.3.linux-amd64.tar.gz -o /tmp/go.tar.gz
    sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf /tmp/go.tar.gz
    export PATH=$PATH:/usr/local/go/bin
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.zshrc
    rm /tmp/go.tar.gz
    echo -e "${GREEN}✓ Go instalado com sucesso${NC}"
}

# Função para instalar Node.js
install_node() {
    echo -e "${YELLOW}📦 Instalando Node.js...${NC}"
    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
    sudo apt-get install -y nodejs
    echo -e "${GREEN}✓ Node.js instalado com sucesso${NC}"
}

# Função para instalar pnpm
install_pnpm() {
    echo -e "${YELLOW}📦 Instalando pnpm...${NC}"
    npm install -g pnpm
    echo -e "${GREEN}✓ pnpm instalado com sucesso${NC}"
}

# Função para instalar Deno
install_deno() {
    echo -e "${YELLOW}📦 Instalando Deno...${NC}"
    curl -fsSL https://deno.land/install.sh | sh
    export DENO_INSTALL="$HOME/.deno"
    export PATH="$DENO_INSTALL/bin:$PATH"
    echo 'export DENO_INSTALL="$HOME/.deno"' >> ~/.zshrc
    echo 'export PATH="$DENO_INSTALL/bin:$PATH"' >> ~/.zshrc
    echo -e "${GREEN}✓ Deno instalado com sucesso${NC}"
}

# Função para instalar tmux
install_tmux() {
    echo -e "${YELLOW}📦 Instalando tmux...${NC}"
    sudo apt-get update && sudo apt-get install -y tmux
    echo -e "${GREEN}✓ tmux instalado com sucesso${NC}"
}

# Função para verificar e instalar dependência
ensure_dependency() {
    local cmd=$1
    local name=$2
    local install_func=$3
    
    if ! command -v "$cmd" &> /dev/null; then
        echo -e "${RED}✗ $name não está instalado${NC}"
        read -p "Deseja instalar $name agora? (s/n): " install_choice
        if [[ "$install_choice" =~ ^[Ss]$ ]]; then
            $install_func
            return 0
        else
            echo -e "${RED}Não é possível continuar sem $name${NC}"
            return 1
        fi
    fi
    return 0
}

# Função para iniciar o Backend Go
start_backend() {
    echo -e "\n${BLUE}🚀 Iniciando Backend Go...${NC}"
    
    # Verificar/instalar Go
    ensure_dependency "go" "Go" "install_go" || return 1
    
    cd "$PROJECT_ROOT/backend"
    
    # Carregar variáveis de ambiente se existir .env
    if [ -f ".env" ]; then
        echo -e "${GREEN}  ✓ Carregando variáveis de .env${NC}"
        set -a
        source .env
        set +a
    else
        echo -e "${YELLOW}  ⚠ Arquivo .env não encontrado, usando valores padrão${NC}"
    fi
    
    # Baixar dependências se necessário
    if [ ! -f "go.sum" ]; then
        echo -e "${YELLOW}  📦 Baixando dependências Go...${NC}"
        go mod download
    fi
    
    echo -e "${GREEN}  ▶ Executando: go run ./cmd/api${NC}"
    echo -e "${CYAN}  📍 API disponível em: http://localhost:${PORT:-8214}${NC}"
    echo -e "${CYAN}  📚 Swagger UI: http://localhost:${PORT:-8214}/swagger/index.html${NC}\n"
    
    go run ./cmd/api
}

# Função para iniciar o Backoffice NestJS
start_backoffice() {
    echo -e "\n${PURPLE}🚀 Iniciando Backoffice NestJS...${NC}"
    
    # Verificar/instalar Node.js
    ensure_dependency "node" "Node.js" "install_node" || return 1
    
    # Verificar/instalar pnpm
    if ! command -v pnpm &> /dev/null; then
        read -p "pnpm não encontrado. Deseja instalar? (s/n): " install_choice
        if [[ "$install_choice" =~ ^[Ss]$ ]]; then
            install_pnpm
        fi
    fi
    
    cd "$PROJECT_ROOT/backoffice"
    
    # Determinar gerenciador de pacotes (pnpm ou npm)
    if command -v pnpm &> /dev/null; then
        PKG_MANAGER="pnpm"
    else
        PKG_MANAGER="npm"
        echo -e "${YELLOW}  ⚠ pnpm não encontrado, usando npm${NC}"
    fi
    
    # Instalar dependências se necessário
    if [ ! -d "node_modules" ]; then
        echo -e "${YELLOW}  📦 Instalando dependências...${NC}"
        $PKG_MANAGER install
    fi
    
    # Gerar Prisma client
    if [ -f "prisma/schema.prisma" ]; then
        echo -e "${YELLOW}  🔧 Gerando Prisma client...${NC}"
        $PKG_MANAGER run prisma:generate 2>/dev/null || npx prisma generate
    fi
    
    echo -e "${GREEN}  ▶ Executando: $PKG_MANAGER run start:dev${NC}"
    echo -e "${CYAN}  📍 Backoffice disponível em: http://localhost:3000${NC}"
    echo -e "${CYAN}  📚 Swagger: http://localhost:3000/api${NC}\n"
    
    $PKG_MANAGER run start:dev
}

# Função para iniciar o Marketplace React
start_marketplace() {
    echo -e "\n${BLUE}🚀 Iniciando Marketplace React...${NC}"
    
    # Verificar/instalar Node.js
    ensure_dependency "node" "Node.js" "install_node" || return 1
    
    cd "$PROJECT_ROOT/marketplace"
    
    # Instalar dependências se necessário
    if [ ! -d "node_modules" ]; then
        echo -e "${YELLOW}  📦 Instalando dependências...${NC}"
        npm install
    fi
    
    echo -e "${GREEN}  ▶ Executando: npm run dev${NC}"
    echo -e "${CYAN}  📍 Marketplace disponível em: http://localhost:5173${NC}\n"
    
    npm run dev
}

# Função para iniciar o Website Fresh/Deno
start_website() {
    echo -e "\n${GREEN}🚀 Iniciando Website (Fresh/Deno)...${NC}"
    
    # Verificar/instalar Deno
    ensure_dependency "deno" "Deno" "install_deno" || return 1
    
    cd "$PROJECT_ROOT/website"
    
    echo -e "${GREEN}  ▶ Executando: deno task dev${NC}"
    echo -e "${CYAN}  📍 Website disponível em: http://localhost:8000${NC}\n"
    
    deno task dev
}

# Função para exibir o menu
show_menu() {
    echo -e "\n${YELLOW}Selecione o serviço para iniciar:${NC}\n"
    echo -e "  ${BLUE}1)${NC} Backend Go            ${CYAN}(porta 8214)${NC}"
    echo -e "  ${BLUE}2)${NC} Backoffice NestJS     ${CYAN}(porta 3000)${NC}"
    echo -e "  ${BLUE}3)${NC} Marketplace React     ${CYAN}(porta 5173)${NC}"
    echo -e "  ${BLUE}4)${NC} Website Fresh/Deno    ${CYAN}(porta 8000)${NC}"
    echo -e ""
    echo -e "  ${GREEN}5)${NC} Iniciar Todos os Serviços"
    echo -e ""
    echo -e "  ${RED}0)${NC} Sair"
    echo -e ""
}

# Função para iniciar todos os serviços em terminais separados
start_all_services() {
    echo -e "\n${GREEN}🚀 Iniciando todos os serviços...${NC}\n"
    
    # Verificar/instalar tmux
    ensure_dependency "tmux" "tmux" "install_tmux" || return 1
    
    # Matar sessão anterior se existir
    tmux kill-session -t saveinmed 2>/dev/null || true
    
    tmux new-session -d -s saveinmed -n backend "cd $PROJECT_ROOT && ./start.sh --backend"
    tmux new-window -t saveinmed -n backoffice "cd $PROJECT_ROOT && ./start.sh --backoffice"
    tmux new-window -t saveinmed -n marketplace "cd $PROJECT_ROOT && ./start.sh --marketplace"
    tmux new-window -t saveinmed -n website "cd $PROJECT_ROOT && ./start.sh --website"
    
    echo -e "${GREEN}✓ Serviços iniciados em sessão tmux 'saveinmed'${NC}"
    echo -e "${CYAN}  Use 'tmux attach -t saveinmed' para acessar${NC}"
    echo -e "${CYAN}  Use Ctrl+B + número para trocar de janela${NC}\n"
    
    tmux attach -t saveinmed
}

# Processar argumentos de linha de comando
if [ $# -gt 0 ]; then
    case "$1" in
        --backend|-b|1)
            start_backend
            exit 0
            ;;
        --backoffice|-o|2)
            start_backoffice
            exit 0
            ;;
        --marketplace|-m|3)
            start_marketplace
            exit 0
            ;;
        --website|-w|4)
            start_website
            exit 0
            ;;
        --all|-a|5)
            show_banner
            start_all_services
            exit 0
            ;;
        --help|-h)
            show_banner
            echo "Uso: $0 [OPÇÃO]"
            echo ""
            echo "Opções:"
            echo "  --backend, -b, 1     Iniciar Backend Go (porta 8214)"
            echo "  --backoffice, -o, 2  Iniciar Backoffice NestJS (porta 3000)"
            echo "  --marketplace, -m, 3 Iniciar Marketplace React (porta 5173)"
            echo "  --website, -w, 4     Iniciar Website Deno (porta 8000)"
            echo "  --all, -a, 5         Iniciar todos os serviços"
            echo "  --help, -h           Mostrar esta ajuda"
            echo ""
            exit 0
            ;;
        *)
            echo -e "${RED}Opção inválida: $1${NC}"
            echo "Use --help para ver as opções disponíveis"
            exit 1
            ;;
    esac
fi

# Menu interativo
show_banner

echo -e "${YELLOW}Verificando dependências...${NC}"
echo ""
check_dependency "go" "Go"
check_dependency "node" "Node.js"
check_dependency "npm" "npm"
check_dependency "pnpm" "pnpm (opcional, usa npm como fallback)"
check_dependency "deno" "Deno"
check_dependency "tmux" "tmux (para iniciar todos)"
echo ""

while true; do
    show_menu
    read -p "Opção: " choice
    
    case $choice in
        1)
            start_backend
            break
            ;;
        2)
            start_backoffice
            break
            ;;
        3)
            start_marketplace
            break
            ;;
        4)
            start_website
            break
            ;;
        5)
            start_all_services
            break
            ;;
        0)
            echo -e "\n${GREEN}👋 Até logo!${NC}\n"
            exit 0
            ;;
        *)
            echo -e "${RED}Opção inválida. Tente novamente.${NC}"
            ;;
    esac
done
