#!/bin/bash
# Script de setup para ambiente de desenvolvimento
# Uso: ./scripts/setup-dev.sh [--ssh]
#
# Opcoes:
#   --ssh    Configurar remotes usando SSH (para repositorio privado)

set -e

# Verificar se deve usar SSH
USE_SSH=false
if [ "$1" = "--ssh" ]; then
    USE_SSH=true
fi

echo "=== Setup do Ambiente de Desenvolvimento ==="
echo ""

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

# Funcao para printar status
ok() { echo -e "${GREEN}[OK]${NC} $1"; }
warn() { echo -e "${YELLOW}[AVISO]${NC} $1"; }
err() { echo -e "${RED}[ERRO]${NC} $1"; }
info() { echo -e "${CYAN}[INFO]${NC} $1"; }

# 1. Verificar pre-requisitos
echo "1. Verificando pre-requisitos..."

# Verificar Bun
if command -v bun &> /dev/null; then
    BUN_VERSION=$(bun --version)
    ok "Bun instalado: v$BUN_VERSION"
else
    err "Bun nao encontrado!"
    echo "   Instale com: curl -fsSL https://bun.sh/install | bash"
    exit 1
fi

# Verificar Docker
if command -v docker &> /dev/null; then
    ok "Docker instalado"
else
    warn "Docker nao encontrado. Voce precisara configurar o PostgreSQL manualmente."
fi

# Verificar Git
if command -v git &> /dev/null; then
    ok "Git instalado"
else
    err "Git nao encontrado!"
    exit 1
fi

# Verificar SSH key (se usando SSH)
if [ "$USE_SSH" = true ]; then
    echo ""
    echo "1.1. Verificando chave SSH..."
    if [ -f "$HOME/.ssh/id_ed25519.pub" ] || [ -f "$HOME/.ssh/id_rsa.pub" ]; then
        ok "Chave SSH encontrada"
        echo "   Certifique-se de que a chave esta adicionada no GitHub e Forgejo"
    else
        warn "Chave SSH nao encontrada!"
        echo ""
        echo "   Para criar uma chave SSH:"
        echo "   ssh-keygen -t ed25519 -C \"seu-email@exemplo.com\""
        echo ""
        echo "   Depois adicione a chave publica em:"
        echo "   - GitHub: Settings > SSH and GPG keys > New SSH key"
        echo "   - Forgejo: Settings > SSH / GPG Keys > Add Key"
        echo ""
        read -p "   Deseja continuar mesmo assim? (s/N) " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Ss]$ ]]; then
            exit 1
        fi
    fi
fi

echo ""

# 2. Configurar remotes do Git
echo "2. Configurando remotes do Git..."

# Verificar se estamos em um repositorio git
if [ ! -d ".git" ]; then
    err "Este diretorio nao e um repositorio Git!"
    exit 1
fi

# URLs dos remotes
if [ "$USE_SSH" = true ]; then
    ORIGIN_URL="git@github.com:esdrasrenan/sistema-de-chamados.git"
    FORGEJO_URL="ssh://git@git.esdrasrenan.com.br:2222/esdras/sistema-de-chamados.git"
    info "Usando SSH para os remotes (repositorio privado)"
else
    ORIGIN_URL="https://github.com/esdrasrenan/sistema-de-chamados.git"
    FORGEJO_URL="https://git.esdrasrenan.com.br/esdras/sistema-de-chamados.git"
    info "Usando HTTPS para os remotes (repositorio publico)"
fi

# Configurar/atualizar origin
CURRENT_ORIGIN=$(git remote get-url origin 2>/dev/null || echo "")
if [ "$CURRENT_ORIGIN" != "$ORIGIN_URL" ]; then
    if [ -n "$CURRENT_ORIGIN" ]; then
        git remote set-url origin "$ORIGIN_URL"
        ok "Remote 'origin' atualizado para $ORIGIN_URL"
    fi
else
    ok "Remote 'origin' ja configurado corretamente"
fi

# Verificar/adicionar remote forgejo
if git remote get-url forgejo &> /dev/null; then
    CURRENT_FORGEJO=$(git remote get-url forgejo)
    if [ "$CURRENT_FORGEJO" != "$FORGEJO_URL" ]; then
        git remote set-url forgejo "$FORGEJO_URL"
        ok "Remote 'forgejo' atualizado para $FORGEJO_URL"
    else
        ok "Remote 'forgejo' ja configurado corretamente"
    fi
else
    git remote add forgejo "$FORGEJO_URL"
    ok "Remote 'forgejo' adicionado"
fi

# Mostrar remotes
echo "   Remotes configurados:"
git remote -v | sed 's/^/   /'

echo ""

# 3. Instalar dependencias
echo "3. Instalando dependencias..."
bun install
ok "Dependencias instaladas"

echo ""

# 4. Configurar arquivo .env
echo "4. Configurando arquivo .env..."

if [ -f ".env" ]; then
    warn "Arquivo .env ja existe. Pulando..."
else
    if [ -f ".env.example" ]; then
        cp .env.example .env
        ok "Arquivo .env criado a partir do .env.example"
        warn "IMPORTANTE: Edite o arquivo .env com suas configuracoes!"
    else
        # Criar .env basico
        cat > .env << 'EOF'
DATABASE_URL=postgresql://postgres:dev@localhost:5432/sistema_chamados
BETTER_AUTH_SECRET=dev-secret-change-in-production
NEXT_PUBLIC_APP_URL=http://localhost:3000
BETTER_AUTH_URL=http://localhost:3000
NEXT_PUBLIC_CONVEX_URL=http://localhost:3210
EOF
        ok "Arquivo .env criado com valores padrao para desenvolvimento"
        warn "IMPORTANTE: Ajuste as configuracoes conforme necessario!"
    fi
fi

echo ""

# 5. Configurar PostgreSQL via Docker
echo "5. Configurando PostgreSQL..."

if command -v docker &> /dev/null; then
    if docker ps -a --format '{{.Names}}' | grep -q '^postgres-dev$'; then
        # Container existe, verificar se esta rodando
        if docker ps --format '{{.Names}}' | grep -q '^postgres-dev$'; then
            ok "PostgreSQL ja esta rodando"
        else
            docker start postgres-dev
            ok "PostgreSQL iniciado"
        fi
    else
        # Criar container
        docker run -d \
            --name postgres-dev \
            -p 5432:5432 \
            -e POSTGRES_PASSWORD=dev \
            -e POSTGRES_DB=sistema_chamados \
            postgres:16
        ok "PostgreSQL criado e iniciado"
        echo "   Aguardando PostgreSQL inicializar..."
        sleep 3
    fi
else
    warn "Docker nao disponivel. Configure o PostgreSQL manualmente."
    echo "   DATABASE_URL deve apontar para seu servidor PostgreSQL"
fi

echo ""

# 6. Gerar cliente Prisma
echo "6. Gerando cliente Prisma..."
bun run prisma:generate
ok "Cliente Prisma gerado"

echo ""

# 7. Inicializar banco de dados
echo "7. Inicializando banco de dados..."

# Verificar se o banco esta acessivel
if bunx prisma db push --skip-generate 2>/dev/null; then
    ok "Schema do banco atualizado"

    # Seed inicial
    echo "   Populando dados iniciais..."
    if bun run auth:seed 2>/dev/null; then
        ok "Dados iniciais criados"
    else
        warn "Seed falhou ou ja foi executado anteriormente"
    fi
else
    warn "Nao foi possivel conectar ao banco de dados"
    echo "   Verifique se o PostgreSQL esta rodando e as credenciais no .env"
fi

echo ""

# 8. Configurar alias do Git (opcional)
echo "8. Configurando alias do Git..."

if git config --get alias.push-all &> /dev/null; then
    ok "Alias 'push-all' ja configurado"
else
    git config alias.push-all '!git push origin main && git push forgejo main'
    ok "Alias 'push-all' criado (use: git push-all)"
fi

echo ""
echo "=== Setup Concluido! ==="
echo ""
echo "Proximos passos:"
echo "  1. Verifique/edite o arquivo .env"
echo "  2. Execute: bun run dev:bun"
echo "  3. Acesse: http://localhost:3000"
echo "  4. Login: admin@sistema.dev / admin123"
echo ""
echo "Para fazer deploy:"
echo "  git push origin main && git push forgejo main"
echo "  ou: git push-all"
echo ""
