#!/usr/bin/env bash
# ============================================================================
#  Membresia 360 — Instalador automático para VPS (Ubuntu 22.04 / 24.04)
#  Instala: Node.js 20, Bun, Nginx, PM2, clona o repositório, cria o .env,
#           faz build, configura o site no Nginx e (opcional) emite SSL grátis.
#
#  Uso:
#    curl -fsSL https://SEU-DOMINIO/install-membresia360.sh -o install.sh
#    sudo bash install.sh
#
#  Ou com variáveis pré-definidas (não interativo):
#    sudo REPO_URL="https://github.com/usuario/repo.git" \
#         DOMAIN="app.suaigreja.com.br" \
#         EMAIL="admin@suaigreja.com.br" \
#         VITE_SUPABASE_URL="https://abc123.supabase.co" \
#         VITE_SUPABASE_ANON_KEY="sua_chave_anon" \
#         SUPABASE_SERVICE_ROLE_KEY="sua_chave_service_role" \
#         bash install.sh
# ============================================================================
set -euo pipefail

# ---------- helpers ----------
c_reset="\033[0m"; c_gold="\033[38;5;220m"; c_green="\033[32m"; c_red="\033[31m"; c_dim="\033[2m"
log()  { echo -e "${c_gold}▶ $*${c_reset}"; }
ok()   { echo -e "${c_green}✔ $*${c_reset}"; }
warn() { echo -e "${c_red}! $*${c_reset}"; }
require_root() { [ "$(id -u)" -eq 0 ] || { warn "Execute como root (use sudo)."; exit 1; }; }
require_env() {
  local name="$1" value="${!1:-}"
  if [ -z "$value" ]; then
    warn "Variável obrigatória $name não foi informada."
    warn "Informe via variável de ambiente ou interativamente."
    exit 1
  fi
}

require_root

# ---------- entrada ----------
: "${REPO_URL:=}"
: "${DOMAIN:=}"
: "${EMAIL:=}"
: "${APP_DIR:=/var/www/membresia360}"
: "${APP_PORT:=3000}"
: "${NODE_MAJOR:=20}"
: "${VITE_SUPABASE_URL:=}"
: "${VITE_SUPABASE_ANON_KEY:=}"
: "${VITE_SUPABASE_PUBLISHABLE_KEY:=}"
: "${VITE_SUPABASE_PROJECT_ID:=}"
: "${SUPABASE_URL:=}"
: "${SUPABASE_PUBLISHABLE_KEY:=}"
: "${SUPABASE_SERVICE_ROLE_KEY:=}"
: "${VITE_PUBLIC_SITE_URL:=}"

if [ -z "$REPO_URL" ]; then
  read -rp "URL do repositório Git (ex: https://github.com/usuario/repo.git): " REPO_URL
fi
if [ -z "$VITE_SUPABASE_URL" ]; then
  read -rp "URL do Supabase (ex: https://abc123.supabase.co): " VITE_SUPABASE_URL
fi
if [ -z "$VITE_SUPABASE_ANON_KEY" ]; then
  read -rp "Chave anon/public do Supabase: " VITE_SUPABASE_ANON_KEY
fi
if [ -z "$SUPABASE_SERVICE_ROLE_KEY" ]; then
  read -rp "Chave service_role do Supabase (server side): " SUPABASE_SERVICE_ROLE_KEY
fi
if [ -z "$DOMAIN" ]; then
  read -rp "Domínio (ex: app.suaigreja.com.br) [enter para pular SSL]: " DOMAIN || true
fi
if [ -n "$DOMAIN" ] && [ -z "$EMAIL" ]; then
  read -rp "E-mail para o certificado SSL Let's Encrypt: " EMAIL || true
fi

# ---------- validação de variáveis obrigatórias do Supabase ----------
require_env "REPO_URL"
require_env "VITE_SUPABASE_URL"
require_env "VITE_SUPABASE_ANON_KEY"
require_env "SUPABASE_SERVICE_ROLE_KEY"

log "Repositório : $REPO_URL"
log "Supabase    : $VITE_SUPABASE_URL"
log "Domínio     : ${DOMAIN:-<nenhum>}"
log "Diretório   : $APP_DIR"
log "Porta app   : $APP_PORT"
echo

# ---------- 1. Sistema ----------
log "Atualizando pacotes do sistema..."
export DEBIAN_FRONTEND=noninteractive
apt-get update -y
apt-get upgrade -y
apt-get install -y curl git build-essential ufw ca-certificates gnupg unzip

# ---------- 2. Node.js ----------
if ! command -v node >/dev/null 2>&1; then
  log "Instalando Node.js ${NODE_MAJOR}.x..."
  curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | bash -
  apt-get install -y nodejs
else
  ok "Node.js já instalado ($(node -v))"
fi

# ---------- 3. Bun ----------
if ! command -v bun >/dev/null 2>&1; then
  log "Instalando Bun..."
  curl -fsSL https://bun.sh/install | bash
  ln -sf /root/.bun/bin/bun /usr/local/bin/bun
else
  ok "Bun já instalado ($(bun -v))"
fi

# ---------- 4. PM2 ----------
if ! command -v pm2 >/dev/null 2>&1; then
  log "Instalando PM2..."
  npm install -g pm2
else
  ok "PM2 já instalado"
fi

# ---------- 5. Nginx ----------
if ! command -v nginx >/dev/null 2>&1; then
  log "Instalando Nginx..."
  apt-get install -y nginx
else
  ok "Nginx já instalado"
fi

# ---------- 6. Firewall ----------
log "Configurando firewall (UFW)..."
ufw allow OpenSSH || true
ufw allow 'Nginx Full' || true
yes | ufw enable || true

# ---------- 7. Clonar / atualizar repo ----------
mkdir -p "$(dirname "$APP_DIR")"
if [ -d "$APP_DIR/.git" ]; then
  log "Atualizando repositório existente..."
  git -C "$APP_DIR" pull --ff-only
else
  log "Clonando repositório em $APP_DIR ..."
  git clone "$REPO_URL" "$APP_DIR"
fi
cd "$APP_DIR"

# ---------- 8. Criar .env com credenciais do Supabase ----------
log "Criando arquivo .env com credenciais do Supabase..."
ENV_FILE="$APP_DIR/.env"
{
  echo "# Frontend (anon/public key)"
  echo "VITE_SUPABASE_URL=$VITE_SUPABASE_URL"
  echo "VITE_SUPABASE_ANON_KEY=$VITE_SUPABASE_ANON_KEY"
  echo "VITE_SUPABASE_PUBLISHABLE_KEY=${VITE_SUPABASE_PUBLISHABLE_KEY:-$VITE_SUPABASE_ANON_KEY}"
  echo "VITE_SUPABASE_PROJECT_ID=${VITE_SUPABASE_PROJECT_ID:-$(basename "$VITE_SUPABASE_URL" .supabase.co)}"
  echo ""
  echo "# Backend (service_role key — server side)"
  echo "SUPABASE_URL=${SUPABASE_URL:-$VITE_SUPABASE_URL}"
  echo "SUPABASE_PUBLISHABLE_KEY=${SUPABASE_PUBLISHABLE_KEY:-$VITE_SUPABASE_ANON_KEY}"
  echo "SUPABASE_SERVICE_ROLE_KEY=$SUPABASE_SERVICE_ROLE_KEY"
  echo ""
  echo "# URL pública do site (usada em links/QR Code)"
  echo "VITE_PUBLIC_SITE_URL=${VITE_PUBLIC_SITE_URL:-${DOMAIN:+https://$DOMAIN}}"
} > "$ENV_FILE"
ok "Arquivo .env criado em $ENV_FILE"

# ---------- 9. Instalar deps e build ----------
log "Instalando dependências (bun install)..."
bun install

log "Gerando build de produção para VPS/Node..."
NITRO_PRESET=node-server bun run build:vps || NITRO_PRESET=node-server npm run build:vps

if [ ! -f "$APP_DIR/.output/server/index.mjs" ]; then
  warn "Build não gerou .output/server/index.mjs. Verifique a saída do build antes de continuar."
  exit 1
fi

# ---------- 10. PM2 start ----------
log "Iniciando aplicação com PM2 na porta ${APP_PORT}..."
pm2 delete membresia360 >/dev/null 2>&1 || true
PORT="$APP_PORT" NODE_ENV=production pm2 start "bun run start" --name membresia360 --update-env
pm2 save
pm2 startup systemd -u root --hp /root | tail -n 1 | bash || true

# ---------- 11. Nginx site ----------
SITE_NAME="${DOMAIN:-membresia360}"
CONF="/etc/nginx/sites-available/${SITE_NAME}"
log "Configurando Nginx (${CONF})..."
cat > "$CONF" <<NGINX
server {
    listen 80;
    server_name ${DOMAIN:-_};

    client_max_body_size 25M;

    location / {
        proxy_pass         http://127.0.0.1:${APP_PORT};
        proxy_http_version 1.1;
        proxy_set_header   Upgrade \$http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host \$host;
        proxy_set_header   X-Real-IP \$remote_addr;
        proxy_set_header   X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto \$scheme;
        proxy_cache_bypass \$http_upgrade;
    }
}
NGINX

ln -sf "$CONF" "/etc/nginx/sites-enabled/${SITE_NAME}"
rm -f /etc/nginx/sites-enabled/default
nginx -t
systemctl reload nginx
ok "Nginx configurado."

# ---------- 12. SSL (opcional) ----------
if [ -n "$DOMAIN" ] && [ -n "$EMAIL" ]; then
  log "Emitindo certificado SSL para ${DOMAIN}..."
  apt-get install -y certbot python3-certbot-nginx
  certbot --nginx -d "$DOMAIN" --non-interactive --agree-tos -m "$EMAIL" --redirect || \
    warn "Falha ao emitir SSL — verifique se o DNS do domínio aponta para este servidor."
else
  warn "SSL não configurado (sem DOMAIN/EMAIL). Rode 'certbot --nginx' depois de apontar o DNS."
fi

echo
ok "Instalação concluída!"
echo -e "${c_dim}App:${c_reset}    http://${DOMAIN:-<IP-do-servidor>}"
echo -e "${c_dim}Logs:${c_reset}   pm2 logs membresia360"
echo -e "${c_dim}Status:${c_reset} pm2 status"
