#!/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}"
IMAGE_NAME="${IMAGE_NAME:-registry.gitlab.com/brsistemas1/forcavenda_ft/thunderapi:latest}"
CHECK_SCRIPT_NAME="${CHECK_SCRIPT_NAME:-check-updateapi.sh}"
CRON_LOG="${CRON_LOG:-/var/log/forcavenda-ft-check.log}"
DOCKER_CONFIG="${DOCKER_CONFIG:-/root/docker-auth}"

export DOCKER_CONFIG

echo "===================================="
echo "[UPDATE] Atualizando ForcaVenda FT API"
echo "===================================="

if [ "$(id -u)" -ne 0 ]; then
  echo "[ERRO] Execute este script como root."
  echo "Exemplo: sudo ./update.sh"
  exit 1
fi

if [ ! -d "$APP_DIR" ]; then
  echo "[ERRO] Diretorio da aplicacao nao encontrado:"
  echo "$APP_DIR"
  exit 1
fi

if [ ! -f "$DOCKER_CONFIG/config.json" ]; then
  echo "[ERRO] Configuracao de autenticacao Docker nao encontrada:"
  echo "$DOCKER_CONFIG/config.json"
  echo ""
  echo "Configure o login do GitLab Registry antes de continuar."
  exit 1
fi

if ! grep -q '"registry.gitlab.com"' "$DOCKER_CONFIG/config.json"; then
  echo "[ERRO] Credencial do GitLab Registry nao encontrada em:"
  echo "$DOCKER_CONFIG/config.json"
  exit 1
fi

chmod 600 "$DOCKER_CONFIG/config.json"

cd "$APP_DIR"

APP_VERSION=$(curl -fsSL "$REPO_URL/version.txt" | tr -d '[:space:]' || true)

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

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

if ! docker info >/dev/null 2>&1; then
  echo "[ERRO] Docker nao esta em execucao."
  exit 1
fi

echo "[OK] Docker disponivel"

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

if docker --config "$DOCKER_CONFIG" compose version >/dev/null 2>&1; then
  COMPOSE_TYPE="v2"
  echo "[OK] Utilizando Docker Compose V2"
elif command -v docker-compose >/dev/null 2>&1; then
  COMPOSE_TYPE="v1"
  echo "[OK] Utilizando Docker Compose V1"
else
  echo "[ERRO] Docker Compose nao encontrado."
  exit 1
fi

compose() {
  if [ "$COMPOSE_TYPE" = "v2" ]; then
    docker --config "$DOCKER_CONFIG" compose "$@"
  else
    DOCKER_CONFIG="$DOCKER_CONFIG" docker-compose "$@"
  fi
}

get_env_value() {
  local key="$1"
  local line

  line=$(grep -E "^${key}=" .env 2>/dev/null | tail -n 1 || true)

  if [ -n "$line" ]; then
    printf '%s\n' "${line#*=}"
  fi
}

ensure_env_value() {
  local key="$1"
  local value="$2"

  if grep -qE "^${key}=" .env; then
    return
  fi

  printf '%s=%s\n' "$key" "$value" >> .env
  echo "[OK] $key adicionado ao .env"
}

ensure_update_cron() {
  echo ""
  echo "[CRON] Verificando atualizacao automatica..."

  local marker="$REPO_URL/$CHECK_SCRIPT_NAME"
  local cron_line
  local current_cron

  cron_line="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 CHECK_SCRIPT_NAME=$CHECK_SCRIPT_NAME DOCKER_CONFIG=$DOCKER_CONFIG bash >> $CRON_LOG 2>&1"

  current_cron="$(crontab -l 2>/dev/null || true)"

  if printf '%s\n' "$current_cron" | grep -F "$marker" >/dev/null 2>&1; then
    if printf '%s\n' "$current_cron" | grep -F "$cron_line" >/dev/null 2>&1; then
      echo "[OK] Crontab ja configurado para rodar a cada 1 hora"
      return
    fi

    echo "[AVISO] Crontab encontrado, mas fora do padrao. Recriando..."
  else
    echo "[AVISO] Crontab nao encontrado. Criando..."
  fi

  {
    printf '%s\n' "$current_cron" | grep -vF "$marker" || true
    echo "$cron_line"
  } | sed '/^$/d' | crontab -

  echo "[OK] Crontab configurado para rodar a cada 1 hora"
}

ensure_update_cron

if [ ! -f ".env" ]; then
  echo "[ERRO] Arquivo .env nao encontrado em:"
  echo "$APP_DIR"
  exit 1
fi

echo ""
echo "[CFG] Ajustando variaveis de ambiente..."

LEGACY_DB_HOST=$(get_env_value "DATABASE_HOST")
LEGACY_DB_PORT=$(get_env_value "DATABASE_PORT")
LEGACY_DB_USER=$(get_env_value "DATABASE_USER")
LEGACY_DB_PASSWORD=$(get_env_value "DATABASE_PASS")
LEGACY_DB_NAME=$(get_env_value "DATABASE_NAME")

ensure_env_value "DB_HOST" "${LEGACY_DB_HOST:-}"
ensure_env_value "DB_PORT" "${LEGACY_DB_PORT:-5432}"
ensure_env_value "DB_USER" "${LEGACY_DB_USER:-postgres}"
ensure_env_value "DB_PASSWORD" "${LEGACY_DB_PASSWORD:-}"
ensure_env_value "DB_NAME" "${LEGACY_DB_NAME:-}"

ensure_env_value "JWT_ALGORITHM" "HS256"
ensure_env_value "JWT_EXPIRATION_MINUTES" "480"
ensure_env_value "API_TITLE" "ForcaVenda FT API"

if [ -n "$APP_VERSION" ]; then
  if grep -qE "^API_VERSION=" .env; then
    sed -i "s|^API_VERSION=.*|API_VERSION=$APP_VERSION|" .env
    echo "[OK] API_VERSION atualizado para $APP_VERSION"
  else
    ensure_env_value "API_VERSION" "$APP_VERSION"
  fi
else
  ensure_env_value "API_VERSION" "1.0.0"
fi

ensure_env_value "DEBUG" "False"
ensure_env_value "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"
ensure_env_value "LOG_LEVEL" "INFO"
ensure_env_value "LOG_DIR" "logs"
ensure_env_value "PYTHONUNBUFFERED" "1"

if ! grep -qE "^JWT_SECRET=" .env; 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)"}

  printf 'JWT_SECRET=%s\n' "$JWT_SECRET" >> .env
  echo "[OK] JWT_SECRET gerado e adicionado ao .env"
fi

ensure_env_value "APP_PORT" "8001"

APP_PORT=$(get_env_value "APP_PORT")

if [ -z "$APP_PORT" ]; then
  APP_PORT="8001"
fi

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

cat > docker-compose.yml <<EOF
services:
  $SERVICE_NAME:
    image: $IMAGE_NAME
    container_name: $APP_NAME
    restart: unless-stopped
    env_file:
      - .env
    ports:
      - "\${APP_PORT}:$CONTAINER_PORT"
EOF

echo "[OK] docker-compose.yml atualizado"

echo ""
echo "[DOWNLOAD] Baixando nova imagem..."

if ! compose pull; then
  echo ""
  echo "[ERRO] Nao foi possivel baixar a imagem:"
  echo "$IMAGE_NAME"
  echo ""
  echo "Teste manualmente com:"
  echo "docker --config $DOCKER_CONFIG pull $IMAGE_NAME"
  exit 1
fi

echo "[OK] Imagem baixada com sucesso"

echo ""
echo "[START] Recriando container..."

compose down || true
docker --config "$DOCKER_CONFIG" rm -f "$APP_NAME" >/dev/null 2>&1 || true
compose up -d --force-recreate

echo ""
echo "[STATUS] Aguardando inicializacao do container..."

sleep 5

if ! docker inspect "$APP_NAME" >/dev/null 2>&1; then
  echo "[ERRO] Container $APP_NAME nao foi criado."
  exit 1
fi

CONTAINER_STATUS=$(docker inspect \
  --format '{{.State.Status}}' \
  "$APP_NAME" 2>/dev/null || true)

if [ "$CONTAINER_STATUS" != "running" ]; then
  echo "[ERRO] Container nao esta em execucao."
  echo "[STATUS] $CONTAINER_STATUS"
  echo ""
  echo "[LOGS]"
  docker logs --tail 100 "$APP_NAME" || true
  exit 1
fi

echo "[OK] Container em execucao"

echo ""
echo "[LIMPEZA] Limpando imagens antigas..."

docker --config "$DOCKER_CONFIG" image prune -f || true
docker --config "$DOCKER_CONFIG" builder prune -f || true

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

echo ""
echo "[STATUS]"
compose ps

echo ""
echo "===================================="
echo "[OK] ForcaVenda FT API atualizada"
echo "[URL] http://$SERVER_IP:$APP_PORT"
echo ""
echo "[IMAGEM] $IMAGE_NAME"
echo "[DOCKER CONFIG] $DOCKER_CONFIG"
echo ""
echo "[CRON] Atualizacao automatica a cada 1 hora"
echo "[LOG] $CRON_LOG"
echo "===================================="