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

# Etat RÉEL des imports Fastmail -> Google Workspace.
#
# ATTENTION : l'ancienne version comparait "somme des dossiers Gmail / somme
# des dossiers Fastmail". C'est FAUX : la migration tourne avec
# --skipcrossduplicates et Gmail dédoublonne via les libellés / "All Mail",
# donc la destination a légitimement MOINS de messages que la source comptée
# dossier par dossier. Résultat : une boîte 100% migrée affichait 62%.
#
# Cette version lit le dernier log imapsync réel de chaque boîte et en tire :
#   - le statut  : terminé / quota Gmail (reprise) / erreur / jamais lancé
#   - le restant : messages présents côté source pas encore côté destination
#     (ligne "there are N ... not on host2" ; sinon "X/Y msgs left")
#   - un % d'avancement HONNÊTE, basé sur les messages identifiés (pas les
#     dossiers), et la date du dernier run.
#
#   etat-import.sh              toutes les boîtes
#   etat-import.sh user@qlf.fr  une seule boîte

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CSV="${MIGRER_CSV:-$SCRIPT_DIR/migrations.csv}"
LOG_DIR="${LOG_DIR:-$HOME/.migrer/logs}"

ONLY="${1:-}"
[ -f "$CSV" ] || { echo "CSV introuvable : $CSV" >&2; exit 1; }

# Log de référence pour une boîte : on privilégie la passe complète (.p2-full),
# sinon un ancien log monobloc. On ignore .run.log (wrapper) et .p1-small
# (passe partielle "petits messages", qui se termine toujours en succès).
pick_log() {
  local d="$1" f
  f="$(ls -t "$LOG_DIR/${d}"_*.p2-full.log 2>/dev/null | head -1)"
  [ -z "$f" ] && f="$(ls -t "$LOG_DIR/${d}"_*.log 2>/dev/null \
        | grep -v -e '\.run\.log$' -e '\.p1-small\.log$' | head -1)"
  printf '%s' "$f"
}

printf '%-26s %-16s %-20s %s\n' "boîte" "statut" "importé" "dernier run"
printf '%-26s %-16s %-20s %s\n' "-----" "------" "-------" "-----------"

nb=0 finis=0 quota=0 erreurs=0 jamais=0
while IFS=, read -r dest _src _pass; do
  dest="$(echo "$dest" | tr -d '\r' | xargs)"
  [ -z "$dest" ] && continue
  [ -n "$ONLY" ] && [ "$dest" != "$ONLY" ] && continue
  nb=$((nb+1))

  log="$(pick_log "$dest")"
  if [ -z "$log" ] || [ ! -f "$log" ]; then
    printf '%-26s %-16s %-20s %s\n' "$dest" "jamais lancé" "—" "—"
    jamais=$((jamais+1)); continue
  fi

  # code de sortie du run, présence d'un mur de quota Gmail
  rc="$(grep -aoE 'Exiting with return value [0-9]+' "$log" | tail -1 | grep -oE '[0-9]+$')"
  rc="${rc:-?}"
  over=0; grep -aqE 'EXIT_OVERQUOTA|ERR_OVERQUOTA' "$log" && over=1

  # restant / total : d'abord la ligne de bilan, sinon le dernier "X/Y msgs left"
  total="" done=""
  line="$(grep -aoE 'there are [0-9]+ among [0-9]+ identified messages in host1 that are not on host2' "$log" | tail -1)"
  if [ -n "$line" ]; then
    left="$(echo "$line" | grep -oE '[0-9]+' | sed -n 1p)"
    total="$(echo "$line" | grep -oE '[0-9]+' | sed -n 2p)"
    done=$(( total - left ))
  else
    line="$(grep -aoE '[0-9]+/[0-9]+ msgs left' "$log" | tail -1)"
    if [ -n "$line" ]; then
      left="${line%%/*}"
      total="$(echo "$line" | grep -oE '/[0-9]+' | grep -oE '[0-9]+')"
      done=$(( total - left ))
    fi
  fi

  if [ -n "$total" ] && [ "$total" -gt 0 ] 2>/dev/null; then
    imp="$(printf '%3d%% (%s/%s)' "$(( done * 100 / total ))" "$done" "$total")"
  else
    imp="—"
  fi

  when="$(date -r "$log" '+%d/%m %H:%M' 2>/dev/null || echo '?')"

  if [ "$rc" = "0" ]; then
    statut="✓ terminé"; finis=$((finis+1))
  elif [ "$over" = "1" ] || [ "$rc" = "113" ]; then
    statut="⏳ quota Gmail"; quota=$((quota+1))
  else
    statut="⚠ erreur (rc=$rc)"; erreurs=$((erreurs+1))
  fi

  printf '%-26s %-16s %-20s %s\n' "$dest" "$statut" "$imp" "$when"
done < <(tail -n +2 "$CSV")

echo
printf 'Total : %d boîtes — %d terminées — %d en quota (reprise auto) — %d erreurs — %d jamais lancées\n' \
  "$nb" "$finis" "$quota" "$erreurs" "$jamais"
echo
echo 'Note : "terminé" = imapsync a fini (code 0). Le % est basé sur les messages'
echo 'identifiés, pas sur le nb brut de mails par dossier (les doublons inter-dossiers'
echo 'sont volontairement fusionnés). Une boîte "terminée" à 100% est bien complète.'
