#!/bin/bash

REPO_URL="https://repositorio.brsistemas.com.br/thundersd"
APP_VERSION=$(curl -fsSL "$REPO_URL/version.txt" | tr -d '[:space:]' || echo "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."
  echo "Use instalacao tradicional Python ou migre para Ubuntu 20/22/24 64 bits."
  exit 1
fi

set -e

APP_DIR="/opt/thundersd"
APP_NAME="thundersd"
CONTAINER_PORT="8000"
IMAGE_NAME="registry.gitlab.com/brsistemas1/thundersd/thundersd:latest"

echo "===================================="
echo "[START] Instalando ThunderSD com Docker Compose"
echo "===================================="

read -p "Usuario GitLab: " GITLAB_USER
read -s -p "Token GitLab: " GITLAB_TOKEN
echo ""

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

DB_USER="postgres"

echo "[OK] Usuario banco: postgres"

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

echo ""
echo "[LIMPEZA] Removendo repositorios PostgreSQL antigos, se existirem..."

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"

  if ! command -v lsof >/dev/null 2>&1; then
    sudo apt update --allow-releaseinfo-change -y
    sudo apt install -y lsof
  fi
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 8000..."

APP_PORT=8000

if sudo lsof -i :8000 >/dev/null 2>&1; then
  echo ""
  echo "[ERRO] Porta 8000 ja esta em uso."
  echo ""
  echo "Portas em uso:"
  sudo lsof -i -P -n | grep LISTEN || true

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

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

  APP_PORT=8001

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

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

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

sudo mkdir -p "$APP_DIR"

echo ""
echo "[CFG] Gravando credenciais do GitLab Registry..."

printf '%s' "$GITLAB_USER" | sudo tee "$APP_DIR/.registry_user" > /dev/null
printf '%s' "$GITLAB_TOKEN" | sudo tee "$APP_DIR/.registry_token" > /dev/null

sudo chmod 600 "$APP_DIR/.registry_user" "$APP_DIR/.registry_token"

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

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

DATABASE_HOST=$DB_HOST
DATABASE_PORT=$DB_PORT
DATABASE_NAME=$DB_NAME
DATABASE_USER=$DB_USER
DATABASE_PASS=$DB_PASS

DATABASE_URL=postgresql+psycopg://$DB_USER:$DB_PASS@$DB_HOST:$DB_PORT/$DB_NAME?connect_timeout=10

PYTHONUNBUFFERED=1
EOF

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

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

services:
  thundersd:
    image: $IMAGE_NAME
    container_name: $APP_NAME
    restart: always
    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-update.sh | bash >> /var/log/thundersd-check.log 2>&1"

(crontab -l 2>/dev/null | grep -v "check-update.sh"; echo "$CRON_CMD") | crontab -

echo ""
echo "[LOGIN] Login no GitLab Container Registry..."

echo "$GITLAB_TOKEN" | sudo docker login registry.gitlab.com -u "$GITLAB_USER" --password-stdin

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 ThunderSD com Docker Compose..."

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] ThunderSD instalado 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-update.sh remoto"
echo ""
echo "[LOG] Log de atualizacao:"
echo "/var/log/thundersd-check.log"
echo "===================================="