#!/bin/bash

PORT=20128
MAX_ATTEMPTS=3
echo "🔄 Reiniciando aplicação na porta $PORT..."

# Função para matar processos pela porta
kill_by_port() {
  local attempt=1
  
  while [ $attempt -le $MAX_ATTEMPTS ]; do
    echo "Tentativa $attempt de $MAX_ATTEMPTS..."
    
    # Tenta encontrar processos usando lsof
    PIDS=$(lsof -ti:$PORT 2>/dev/null)
    
    if [ -z "$PIDS" ]; then
      echo "✓ Porta $PORT está livre"
      return 0
    fi
    
    echo "🔴 Matando processos na porta $PORT: $PIDS"
    
    # Tenta SIGTERM primeiro (mais gentil)
    if [ $attempt -eq 1 ]; then
      for PID in $PIDS; do
        kill $PID 2>/dev/null && echo "  - SIGTERM enviado para PID $PID"
      done
      sleep 2
    else
      # Se não funcionou, usa SIGKILL (força)
      for PID in $PIDS; do
        kill -9 $PID 2>/dev/null && echo "  - SIGKILL enviado para PID $PID"
      done
      sleep 1
    fi
    
    # Fallback: tenta fuser se lsof não funcionou
    if command -v fuser >/dev/null 2>&1; then
      fuser -k -9 $PORT/tcp 2>/dev/null && echo "  - fuser utilizado como fallback"
      sleep 1
    fi
    
    attempt=$((attempt + 1))
  done
  
  # Última verificação
  if lsof -ti:$PORT >/dev/null 2>&1; then
    echo "❌ Erro: Não foi possível liberar a porta $PORT após $MAX_ATTEMPTS tentativas"
    echo "Processos ainda ativos:"
    lsof -i:$PORT 2>/dev/null
    return 1
  fi
  
  return 0
}

# Executa a função de kill
if ! kill_by_port; then
  echo ""
  echo "💡 Sugestão: Execute manualmente:"
  echo "   sudo lsof -ti:$PORT | xargs kill -9"
  exit 1
fi

echo ""
echo "🧹 Limpando build anterior (.next)..."
rm -rf .next

echo "🔨 Fazendo build limpo..."
npm run build
if [ $? -ne 0 ]; then
  echo "❌ Build falhou!"
  exit 1
fi

echo ""
# Garante que a porta está livre antes de iniciar (build pode ter ocupado)
fuser -k $PORT/tcp 2>/dev/null
sleep 1

echo "🚀 Iniciando servidor na porta $PORT..."
LOG_FILE="/tmp/omniroute.log"
> "$LOG_FILE"

npx next start --port $PORT >> "$LOG_FILE" 2>&1 &
SERVER_PID=$!

# Ao fechar (Ctrl+C), mata o servidor e libera a porta
cleanup() {
  echo ""
  echo "🛑 Parando servidor (PID: $SERVER_PID)..."
  kill $SERVER_PID 2>/dev/null
  wait $SERVER_PID 2>/dev/null
  fuser -k $PORT/tcp 2>/dev/null
  echo "✅ Servidor parado. Porta $PORT liberada."
  exit 0
}
trap cleanup SIGINT SIGTERM

# Aguarda o servidor ficar pronto
echo "⏳ Aguardando servidor iniciar (PID: $SERVER_PID)..."
for i in $(seq 1 15); do
  sleep 1
  if curl -s -o /dev/null -w "" http://localhost:$PORT > /dev/null 2>&1; then
    echo ""
    echo "✅ Servidor rodando em http://localhost:$PORT (PID: $SERVER_PID)"
    echo "📄 Pressione Ctrl+C para parar"
    echo "────────────────────────────────────────"
    break
  fi
  printf "."
done

# Fica mostrando os logs na tela até Ctrl+C
tail -f "$LOG_FILE" &
TAIL_PID=$!
wait $SERVER_PID 2>/dev/null
kill $TAIL_PID 2>/dev/null
