#!/bin/bash

set -Eeuo pipefail

REPO_URL="${REPO_URL:-https://repositorio.brsistemas.com.br/forcavenda_ft}"
APP_DIR="${APP_DIR:-/opt/forcavenda_ft}"
APP_NAME="${APP_NAME:-forcavenda-ft}"
SERVICE_NAME="${SERVICE_NAME:-api}"
CONTAINER_PORT="${CONTAINER_PORT:-8000}"
DEFAULT_APP_PORT="${APP_PORT:-8001}"
IMAGE_NAME="registry.gitlab.com/brsistemas1/forcavenda_ft/thunderapi:latest"
CHECK_SCRIPT_NAME="${CHECK_SCRIPT_NAME:-check-updateapi.sh}"

APP_VERSION=$(curl -fsSL "$REPO_URL/version.txt" | tr -d '[:space:]' || echo "0")
APP_VERSION=${APP_VERSION:-0}
ARCH=$(uname -m)

if [ "$ARCH" = "i686" ] || [ "$ARCH" = "i386" ]; then
  echo "[ERRO] Servidor 32 bits detectado: $ARCH"
  echo "Este instalador Docker exige servidor 64 bits."
  exit 1
fi

echo "===================================="
echo "[START] Instalando ForcaVenda FT API"
echo "===================================="

echo ""
echo "[LOGIN] GitLab Container Registry"
echo "Informe as credenciais se a imagem for privada."
read -p "Usuario GitLab [Enter para pular]: " GITLAB_USER
GITLAB_TOKEN=""

if [ -n "$GITLAB_USER" ]; then
  read -s -p "Token GitLab: " GITLAB_TOKEN
  echo ""
fi

echo ""
echo "[CFG] Configuracao do Banco de Dados"

read -p "IP Banco: " DB_HOST
read -p "Porta Banco [5432]: " DB_PORT
DB_PORT=${DB_PORT:-5432}
read -p "Nome Banco: " DB_NAME
read -p "Usuario Banco [postgres]: " DB_USER
DB_USER=${DB_USER:-postgres}

read -s -p "Senha Banco: " DB_PASSWORD
echo ""

echo ""
echo "[CFG] Chave JWT"
echo "Pressione Enter para gerar uma chave segura automaticamente."
read -s -p "JWT Secret [auto]: " JWT_SECRET
echo ""

if [ -z "$JWT_SECRET" ]; then
  if command -v openssl >/dev/null 2>&1; then
    JWT_SECRET=$(openssl rand -hex 32)
  else
    JWT_SECRET=$(tr -dc 'A-Za-z0-9' </dev/urandom | head -c 64 || true)
  fi

  JWT_SECRET=${JWT_SECRET:-"$(date +%s)-$RANDOM-$RANDOM-$(hostname)"}
fi

echo ""
echo "[LIMPEZA] Removendo repositorios PostgreSQL antigos..."

sudo rm -f /etc/apt/sources.list.d/pgdg.list* 2>/dev/null || true
sudo rm -f /etc/apt/sources.list.d/postgresql*.list* 2>/dev/null || true
sudo apt clean || true

echo ""
echo "[DOCKER] Verificando Docker..."

if ! command -v docker >/dev/null 2>&1; then
  echo "[DOCKER] Docker nao encontrado. Instalando..."

  sudo apt update --allow-releaseinfo-change -y
  sudo apt install -y ca-certificates curl gnupg lsb-release lsof

  sudo install -m 0755 -d /etc/apt/keyrings

  if [ ! -f /etc/apt/keyrings/docker.gpg ]; then
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
    sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  fi

  sudo chmod a+r /etc/apt/keyrings/docker.gpg

  echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

  sudo apt update --allow-releaseinfo-change -y
  sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin || true

  sudo systemctl enable docker
  sudo systemctl start docker
else
  echo "[OK] Docker ja instalado"
fi

if ! command -v curl >/dev/null 2>&1 || ! command -v lsof >/dev/null 2>&1; then
  sudo apt update --allow-releaseinfo-change -y
  sudo apt install -y curl lsof
fi

echo ""
echo "[INFO] Verificando Docker Compose..."

if docker compose version >/dev/null 2>&1; then
  COMPOSE_CMD="docker compose"
  echo "[OK] Utilizando Docker Compose V2"
elif command -v docker-compose >/dev/null 2>&1; then
  COMPOSE_CMD="docker-compose"
  echo "[OK] Utilizando Docker Compose V1"
else
  echo "[AVISO] Docker Compose nao encontrado."
  echo "[CFG] Instalando Docker Compose..."

  sudo apt update --allow-releaseinfo-change -y

  if sudo apt install -y docker-compose-plugin >/dev/null 2>&1; then
    COMPOSE_CMD="docker compose"
    echo "[OK] Docker Compose V2 instalado"
  else
    sudo apt install -y docker-compose
    COMPOSE_CMD="docker-compose"
    echo "[OK] Docker Compose V1 instalado"
  fi
fi

echo ""
echo "[INFO] Verificando porta $DEFAULT_APP_PORT..."

APP_PORT=$DEFAULT_APP_PORT

if sudo lsof -i :"$APP_PORT" >/dev/null 2>&1; then
  echo "[ERRO] Porta $APP_PORT ja esta em uso."

  read -p "Deseja procurar outra porta livre? (S/N): " RESP

  if [[ ! "$RESP" =~ ^[Ss]$ ]]; then
    echo "[ERRO] Instalacao cancelada."
    exit 1
  fi

  APP_PORT=$((APP_PORT+1))

  while sudo lsof -i :"$APP_PORT" >/dev/null 2>&1; do
    echo "[AVISO] Porta $APP_PORT ocupada..."
    APP_PORT=$((APP_PORT+1))
  done

  echo "[AVISO] Utilizando porta alternativa: $APP_PORT"
else
  echo "[OK] Porta $APP_PORT disponivel"
fi

echo ""
echo "[DIR] Criando estrutura em $APP_DIR..."

sudo mkdir -p "$APP_DIR"

echo ""
echo "[CFG] Criando .env..."

sudo tee "$APP_DIR/.env" > /dev/null <<EOF
APP_PORT=$APP_PORT

JWT_SECRET=$JWT_SECRET
JWT_ALGORITHM=HS256
JWT_EXPIRATION_MINUTES=480

DB_HOST=$DB_HOST
DB_PORT=$DB_PORT
DB_USER=$DB_USER
DB_PASSWORD=$DB_PASSWORD
DB_NAME=$DB_NAME

API_TITLE=ForcaVenda FT API
API_VERSION=$APP_VERSION
DEBUG=False

CORS_ORIGINS=https://localhost,capacitor://localhost,http://localhost,http://localhost:8001,http://127.0.0.1:8001,http://localhost:8100,http://127.0.0.1:8100
LOG_LEVEL=INFO
LOG_DIR=logs
PYTHONUNBUFFERED=1
EOF

echo ""
echo "[CFG] Criando docker-compose.yml..."

sudo tee "$APP_DIR/docker-compose.yml" > /dev/null <<EOF
version: "2.4"

services:
  $SERVICE_NAME:
    image: $IMAGE_NAME
    container_name: $APP_NAME
    restart: unless-stopped
    env_file:
      - .env
    ports:
      - "\${APP_PORT}:$CONTAINER_PORT"
EOF

echo ""
echo "[CFG] Gravando versao local inicial..."

echo "$APP_VERSION" | sudo tee "$APP_DIR/version.txt" > /dev/null

echo ""
echo "[CFG] Agendando verificacao automatica remota..."

CRON_CMD="0 * * * * curl -fsSL $REPO_URL/$CHECK_SCRIPT_NAME | APP_DIR=$APP_DIR REPO_URL=$REPO_URL APP_NAME=$APP_NAME SERVICE_NAME=$SERVICE_NAME CONTAINER_PORT=$CONTAINER_PORT IMAGE_NAME=$IMAGE_NAME bash >> /var/log/forcavenda-ft-check.log 2>&1"

(sudo crontab -l 2>/dev/null | grep -v "$REPO_URL/$CHECK_SCRIPT_NAME" || true; echo "$CRON_CMD") | sudo crontab -

if [ -n "$GITLAB_USER" ] && [ -n "$GITLAB_TOKEN" ]; then
  echo ""
  echo "[LOGIN] Login no GitLab Container Registry..."

  echo "$GITLAB_TOKEN" | sudo docker login registry.gitlab.com -u "$GITLAB_USER" --password-stdin
else
  echo ""
  echo "[LOGIN] Login no GitLab pulado."
fi

echo ""
echo "[FIREWALL] Liberando porta $APP_PORT..."

sudo ufw allow "$APP_PORT/tcp" || true

echo ""
echo "[STOP] Parando instalacao antiga, se existir..."

sudo docker rm -f "$APP_NAME" || true

echo ""
echo "[START] Subindo ForcaVenda FT API..."

cd "$APP_DIR"

sudo $COMPOSE_CMD pull
sudo $COMPOSE_CMD up -d --force-recreate

SERVER_IP=$(hostname -I | awk '{print $1}')

echo ""
echo "===================================="
echo "[OK] ForcaVenda FT API instalada com sucesso"
echo "[URL] Acesso:"
echo "http://$SERVER_IP:$APP_PORT"
echo ""
echo "[DIR] Arquivos locais:"
echo "$APP_DIR/.env"
echo "$APP_DIR/docker-compose.yml"
echo "$APP_DIR/version.txt"
echo ""
echo "[UPDATE] Atualizacao automatica:"
echo "A cada 1 hora via $CHECK_SCRIPT_NAME remoto"
echo ""
echo "[LOG] Log de atualizacao:"
echo "/var/log/forcavenda-ft-check.log"
echo "===================================="
