#!/usr/bin/env bash
set -euo pipefail

APP_DIR="${APP_DIR:-/var/www/html/superlegis_atualizado}"
APP_USER="${APP_USER:-www-data}"
APP_GROUP="${APP_GROUP:-www-data}"
PHP_BIN="${PHP_BIN:-php}"
COMPOSER_BIN="${COMPOSER_BIN:-composer}"
NODE_ENV="${NODE_ENV:-production}"
RUN_MIGRATIONS="${RUN_MIGRATIONS:-0}"
RUN_TENANT_MIGRATIONS="${RUN_TENANT_MIGRATIONS:-0}"
BUILD_ASSETS="${BUILD_ASSETS:-1}"
OPTIMIZE_APP="${OPTIMIZE_APP:-1}"

log() {
  printf '\n[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*"
}

need_root() {
  if [[ "${EUID}" -ne 0 ]]; then
    echo "Rode como root: sudo bash $0"
    exit 1
  fi
}

run_as_app_user() {
  if command -v runuser >/dev/null 2>&1; then
    runuser -u "$APP_USER" -- "$@"
  else
    su -s /bin/bash "$APP_USER" -c "$(printf '%q ' "$@")"
  fi
}

artisan() {
  run_as_app_user "$PHP_BIN" artisan "$@"
}

need_root

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

cd "$APP_DIR"

if [[ ! -f artisan ]]; then
  echo "Arquivo artisan nao encontrado em $APP_DIR"
  exit 1
fi

log "Colocando aplicacao em modo manutencao"
artisan down --render="errors::503" || true

log "Instalando dependencias PHP"
if command -v "$COMPOSER_BIN" >/dev/null 2>&1; then
  run_as_app_user "$COMPOSER_BIN" install --no-dev --prefer-dist --optimize-autoloader --no-interaction
else
  echo "Composer nao encontrado. Instale o composer ou defina COMPOSER_BIN."
  artisan up || true
  exit 1
fi

if [[ "$BUILD_ASSETS" == "1" && -f package.json ]]; then
  if command -v npm >/dev/null 2>&1; then
    log "Instalando dependencias Node e compilando assets"
    if [[ -f package-lock.json ]]; then
      run_as_app_user npm ci
    else
      run_as_app_user npm install
    fi
    run_as_app_user npm run production
  else
    log "npm nao encontrado; pulando build de assets"
  fi
fi

log "Publicando assets do Livewire"
artisan vendor:publish --force --tag=livewire:assets || true

if [[ "$RUN_MIGRATIONS" == "1" ]]; then
  log "Rodando migrations centrais"
  artisan migrate --force
fi

if [[ "$RUN_TENANT_MIGRATIONS" == "1" ]]; then
  log "Rodando migrations dos tenants"
  artisan tenants:migrate --force
fi

log "Limpando caches"
artisan cache:clear || true
artisan config:clear || true
artisan route:clear || true
artisan view:clear || true

if [[ "$OPTIMIZE_APP" == "1" ]]; then
  log "Otimizando caches"
  artisan config:cache || true
  artisan route:cache || true
  artisan view:cache || true
fi

log "Ajustando permissoes"
chown -R "$APP_USER:$APP_GROUP" storage bootstrap/cache public/uploads public/laws 2>/dev/null || true
find storage bootstrap/cache -type d -exec chmod 775 {} \; 2>/dev/null || true
find storage bootstrap/cache -type f -exec chmod 664 {} \; 2>/dev/null || true

log "Reiniciando workers/filas quando disponivel"
artisan queue:restart || true
artisan horizon:terminate || true

log "Tirando aplicacao do modo manutencao"
artisan up || true

log "Deploy concluido"
echo "APP_DIR=$APP_DIR"
echo "RUN_MIGRATIONS=$RUN_MIGRATIONS"
echo "RUN_TENANT_MIGRATIONS=$RUN_TENANT_MIGRATIONS"
echo "BUILD_ASSETS=$BUILD_ASSETS"
