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

# Variante OAuth : destination Gmail authentifiée en XOAUTH2 via le service
# account GAM (délégation domain-wide). Aucun mot de passe IMAP destination,
# aucune 2FA à activer manuellement. Le compte est créé par GAM.
#
# Prérequis Google (une fois) : le scope https://mail.google.com/ doit être
# autorisé en délégation domain-wide pour le service account. Sinon :
#   gam update domainwidedelegation <client_id> https://mail.google.com/

EMAIL="${1:?usage: migrer-oauth.sh user@domain.fr [--justlogin|--dry|...]}"
shift
EXTRA=("$@")   # options passées telles quelles à imapsync (ex: --justlogin, --dry)

CONF_DIR="${HOME}/.migrer"
DEFAULTS="${CONF_DIR}/defaults-oauth"
mkdir -p "$CONF_DIR"
chmod 700 "$CONF_DIR"

[ -f "$DEFAULTS" ] && source "$DEFAULTS"

ask() {
  local var="$1" prompt="$2" silent="${3:-}"
  local cur="${!var:-}"
  local shown="$prompt"
  [ -n "$cur" ] && [ -z "$silent" ] && shown="$prompt [$cur]"
  [ -n "$cur" ] && [ -n "$silent" ] && shown="$prompt [valeur enregistrée]"

  local val
  if [ -n "$silent" ]; then
    read -rsp "$shown: " val; echo
  else
    read -rp "$shown: " val
  fi
  [ -z "$val" ] && val="$cur"
  printf -v "$var" '%s' "$val"
}

# --- Réglages ---
echo "=== Serveur SOURCE (Fastmail) ==="
ask SRC_HOST "Hôte source"
ask SRC_PORT "Port source"
ask SRC_USER "Login source (souvent l'adresse complète)"
ask SRC_PASS "Mot de passe source (mot de passe d'application Fastmail)" silent

echo "=== Serveur DESTINATION (Google Workspace, OAuth) ==="
ask DST_HOST "Hôte destination"
ask DST_PORT "Port destination"
ask SA_JSON  "Service account JSON (clé GAM, scope https://mail.google.com/)"

echo "=== Création du compte Workspace ==="
ask NEW_FIRSTNAME "Prénom du nouvel utilisateur"
ask NEW_LASTNAME "Nom du nouvel utilisateur"
ask GAM_BIN "Chemin de gam"

DST_USER="$EMAIL"

# défauts non sensibles (le JSON est un chemin, son contenu reste hors du dépôt)
cat > "$DEFAULTS" <<EOF
SRC_HOST="$SRC_HOST"
SRC_PORT="$SRC_PORT"
SRC_USER="$SRC_USER"
DST_HOST="$DST_HOST"
DST_PORT="$DST_PORT"
SA_JSON="$SA_JSON"
NEW_FIRSTNAME="$NEW_FIRSTNAME"
NEW_LASTNAME="$NEW_LASTNAME"
GAM_BIN="$GAM_BIN"
EOF
chmod 600 "$DEFAULTS"

[ -f "$SA_JSON" ] || { echo "Service account introuvable : $SA_JSON" >&2; exit 1; }

# --- 1. Création du compte ---
echo
echo ">>> Vérification / création du compte $DST_USER"
if "$GAM_BIN" info user "$DST_USER" >/dev/null 2>&1; then
  echo "Le compte existe déjà, on saute la création."
else
  echo "Création du compte..."
  "$GAM_BIN" create user "$DST_USER" \
    firstname "$NEW_FIRSTNAME" \
    lastname "$NEW_LASTNAME" \
    password random changepassword off
  echo "Compte créé. Attente de la propagation (15s)..."
  sleep 15
fi

# --- 2. Pré-contrôle OAuth : le service account peut-il accéder au mail ? ---
echo
echo ">>> Vérification de l'accès OAuth (scope mail) pour $DST_USER"
if ! "$GAM_BIN" user "$DST_USER" check serviceaccount; then
  echo "Le service account n'a pas (encore) l'accès mail délégué." >&2
  echo "Autorise le scope puis relance :" >&2
  echo "  gam update domainwidedelegation <client_id> https://mail.google.com/" >&2
  exit 1
fi

# --- 3. Migration IMAP (destination en XOAUTH2, sans mot de passe) ---
echo
echo ">>> Migration de $SRC_USER  ->  $DST_USER"
echo

imapsync \
  --host1 "$SRC_HOST" --port1 "$SRC_PORT" --ssl1 \
  --user1 "$SRC_USER" --password1 "$SRC_PASS" \
  --host2 "$DST_HOST" --port2 "$DST_PORT" --ssl2 \
  --user2 "$DST_USER" --password2 "$SA_JSON" --authmech2 XOAUTH2 \
  --automap \
  --skipcrossduplicates \
  --logdir "$CONF_DIR/logs" \
  --logfile "${EMAIL}_$(date +%Y%m%d_%H%M%S).log" \
  ${EXTRA[@]+"${EXTRA[@]}"}

echo
echo ">>> Terminé."
