#!/usr/bin/env bash
#
# setup-gcloud-pubsub.sh — Configure Google Pub/Sub pour Inbox Zero (idempotent).
#   1. Active les APIs Gmail + Pub/Sub
#   2. Crée le topic
#   3. Autorise Gmail à publier (binding Publisher)
#   4. (optionnel) Crée l'abonnement push — UNIQUEMENT si le HTTPS répond déjà
#
# Usage : bash setup-gcloud-pubsub.sh [fichier.env]
#   Si un fichier .env est fourni, les valeurs (PROJECT_ID, DOMAIN, token) en
#   sont extraites automatiquement ; sinon elles sont demandées en interactif.
#
set -euo pipefail

B=$'\033[1m'; G=$'\033[32m'; Y=$'\033[33m'; R=$'\033[31m'; N=$'\033[0m'

command -v gcloud >/dev/null 2>&1 || { echo "${R}gcloud introuvable. Installe le Google Cloud SDK.${N}"; exit 1; }

ENV_FILE="${1:-}"
GMAIL_SA="gmail-api-push@system.gserviceaccount.com"
TOPIC="inbox-zero"
SUB="inbox-zero-push"

# --- Lecture d'une clé dans le fichier .env ----------------------------------
from_env() {  # from_env KEY -> valeur (vide si absent)
  [ -n "$ENV_FILE" ] && [ -f "$ENV_FILE" ] || return 0
  grep -E "^$1=" "$ENV_FILE" | head -n1 | cut -d= -f2-
}
ask() { local p="$1" d="${2:-}" a; if [ -n "$d" ]; then read -r -p "$p [$d] : " a; else read -r -p "$p : " a; fi; printf '%s' "${a:-$d}"; }

# --- Récupère PROJECT_ID depuis GOOGLE_PUBSUB_TOPIC_NAME (projects/<id>/topics/..)
TOPIC_NAME_ENV="$(from_env GOOGLE_PUBSUB_TOPIC_NAME)"
PROJECT_DEFAULT="$(printf '%s' "$TOPIC_NAME_ENV" | sed -n 's#^projects/\([^/]*\)/topics/.*#\1#p')"
[ -z "$PROJECT_DEFAULT" ] && PROJECT_DEFAULT="inbox-zero-499901"

DOMAIN_DEFAULT="$(from_env NEXT_PUBLIC_BASE_URL | sed -E 's#^https?://##; s#/+$##')"
[ -z "$DOMAIN_DEFAULT" ] && DOMAIN_DEFAULT="inbox.elevaseo.app"

# Normalise un domaine : retire un éventuel schéma http(s):// et slash final,
# pour ne jamais construire une URL à double https://.
strip_scheme() { printf '%s' "$1" | sed -E 's#^https?://##; s#/+$##'; }

TOKEN_DEFAULT="$(from_env GOOGLE_PUBSUB_VERIFICATION_TOKEN)"

echo
echo "${B}=== Setup Google Pub/Sub pour Inbox Zero ===${N}"
[ -n "$ENV_FILE" ] && echo "Source : ${ENV_FILE}"
PROJECT_ID="$(ask "ID projet Google Cloud" "$PROJECT_DEFAULT")"

echo
echo "${G}→ Sélection du projet${N}"
gcloud config set project "$PROJECT_ID" >/dev/null

echo "${G}→ Activation des APIs (gmail, pubsub, people)…${N}"
# people.googleapis.com : Better Auth l'appelle pour récupérer le profil Google
# au login. Sans elle → erreur 'unable_to_create_user' à la connexion.
gcloud services enable gmail.googleapis.com pubsub.googleapis.com people.googleapis.com

# --- Topic (idempotent) ------------------------------------------------------
if gcloud pubsub topics describe "$TOPIC" --project="$PROJECT_ID" >/dev/null 2>&1; then
  echo "${Y}• Topic '$TOPIC' déjà présent — OK${N}"
else
  echo "${G}→ Création du topic '$TOPIC'${N}"
  gcloud pubsub topics create "$TOPIC" --project="$PROJECT_ID"
fi

# --- Binding Publisher (idempotent) ------------------------------------------
echo "${G}→ Autorisation de Gmail à publier (Pub/Sub Publisher)${N}"
gcloud pubsub topics add-iam-policy-binding "$TOPIC" \
  --project="$PROJECT_ID" \
  --member="serviceAccount:${GMAIL_SA}" \
  --role="roles/pubsub.publisher" >/dev/null
echo "  ${G}✓ binding OK${N}"

echo
echo "${B}GOOGLE_PUBSUB_TOPIC_NAME=projects/${PROJECT_ID}/topics/${TOPIC}${N}"

# --- Abonnement push (optionnel) ---------------------------------------------
echo
echo "${B}--- Abonnement push ---${N}"
echo "${Y}À créer UNIQUEMENT quand https://<domaine> répond déjà (SSL Dokploy actif).${N}"
do_push="$(ask "Créer l'abonnement push maintenant ? (oui/non)" "non")"
case "$do_push" in
  oui|o|y|yes)
    DOMAIN="$(ask "Domaine public (sans https://)" "$DOMAIN_DEFAULT")"
    DOMAIN="$(strip_scheme "$DOMAIN")"   # tolère une saisie avec https:// → pas de double schéma
    if [ -n "$TOKEN_DEFAULT" ]; then
      TOKEN="$TOKEN_DEFAULT"; echo "  Token lu depuis $ENV_FILE."
    else
      read -r -s -p "GOOGLE_PUBSUB_VERIFICATION_TOKEN (masqué) : " TOKEN; echo
    fi
    ENDPOINT="https://${DOMAIN}/api/google/webhook?token=${TOKEN}"

    # Vérifie que l'endpoint répond avant de créer (évite le rejet Google)
    if command -v curl >/dev/null 2>&1; then
      code="$(curl -s -o /dev/null -w '%{http_code}' --max-time 10 "https://${DOMAIN}" || echo 000)"
      if [ "$code" = "000" ]; then
        echo "${R}✗ https://${DOMAIN} ne répond pas. Termine le déploiement + SSL d'abord.${N}"
        exit 1
      fi
      echo "  ${G}✓ https://${DOMAIN} répond (HTTP $code)${N}"
    fi

    if gcloud pubsub subscriptions describe "$SUB" --project="$PROJECT_ID" >/dev/null 2>&1; then
      echo "${Y}• Abonnement '$SUB' existe déjà — recréation pour mettre l'endpoint à jour${N}"
      gcloud pubsub subscriptions delete "$SUB" --project="$PROJECT_ID" >/dev/null
    fi
    echo "${G}→ Création de l'abonnement push '$SUB'${N}"
    gcloud pubsub subscriptions create "$SUB" \
      --project="$PROJECT_ID" \
      --topic="$TOPIC" \
      --push-endpoint="$ENDPOINT" \
      --ack-deadline=10
    echo "  ${G}✓ push subscription OK${N}"
    echo
    echo "Vérification :"
    gcloud pubsub subscriptions describe "$SUB" --project="$PROJECT_ID" \
      --format='value(pushConfig.pushEndpoint)'
  ;;
  *)
    echo "${Y}Abonnement push non créé. Relance ce script après le SSL et réponds 'oui'.${N}"
  ;;
esac

echo
echo "${G}✓ Terminé.${N}"
