#!/usr/bin/env bash
# update-all.sh — mise à jour opencode d'une ou plusieurs pages du site Re-info.fr
# Usage:
#   ./update-all.sh <slug>          # met à jour une page (ex: alain-soral)
#   ./update-all.sh --all           # met à jour médias + personnalités
#
# Lancé par cron (crontab -e de l'utilisateur alan).
set -euo pipefail

# Timeout par défaut pour les commandes bash (curl, noembed, etc.)
export OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS=15000

SITE_DIR="/home/alan/SITE/WEB"
CRON_DIR="/home/alan/SITE/CRON"
PROMPT_DIR="${CRON_DIR}/prompts"
LOG_DIR="${CRON_DIR}/logs"
mkdir -p "${LOG_DIR}"

STAMP="$(date +%Y-%m-%d_%H-%M)"
MAJ_LOG="${LOG_DIR}/maj.log"
RAPPORT_LOG="${LOG_DIR}/rapport-quotidien.log"
RAPPORT_DATE="$(date +%Y-%m-%d)"
RAPPORT_OK=0
RAPPORT_ECHEC=0
RAPPORT_LISTE=""
RAPPORT_ANOMALIES=0
RAPPORT_LISTE_ANOM=""

# Lecture des lignes de bilan émises par l'agent (VERDICT, CARTES_*, ERREURS)
# dans le log de la page. Remplit les variables globales VERDICT_VAR, AJOUTS_VAR,
# SUPPR_VAR, TOTAL_VAR, ERREURS_VAR.
parse_bilan() {
  local log_file="$1"
  VERDICT_VAR="" AJOUTS_VAR=0 SUPPR_VAR=0 TOTAL_VAR="" ERREURS_VAR=0
  while IFS= read -r line; do
    case "$line" in
      VERDICT=*) VERDICT_VAR="${line#VERDICT=}" ;;
      CARTES_AJOUTEES=*) AJOUTS_VAR="${line#CARTES_AJOUTEES=}" ;;
      CARTES_SUPPRIMEES=*) SUPPR_VAR="${line#CARTES_SUPPRIMEES=}" ;;
      CARTES_TOTAL=*) TOTAL_VAR="${line#CARTES_TOTAL=}" ;;
      ERREURS=*) ERREURS_VAR="${line#ERREURS=}" ;;
    esac
  done < <(grep -a -E '^(VERDICT|CARTES_AJOUTEES|CARTES_SUPPRIMEES|CARTES_TOTAL|ERREURS)=' "${log_file}" 2>/dev/null || true)
  : "${VERDICT_VAR:=?}" "${AJOUTS_VAR:=0}" "${SUPPR_VAR:=0}" "${TOTAL_VAR:=?}" "${ERREURS_VAR:=0}"
}

run_update() {
  local slug="$1"
  local page="${SITE_DIR}/${slug}.html"
  local prompt="${PROMPT_DIR}/${slug}.txt"

  if [[ ! -f "${page}" ]]; then
    echo "[${STAMP}] Page introuvable: ${page}" >> "${MAJ_LOG}"
    RAPPORT_ECHEC=$((RAPPORT_ECHEC + 1))
    RAPPORT_LISTE="${RAPPORT_LISTE}${slug} (page introuvable)\n"
    return 1
  fi

  if [[ ! -f "${prompt}" ]]; then
    echo "[${STAMP}] Prompt introuvable: ${prompt}" >> "${MAJ_LOG}"
    RAPPORT_ECHEC=$((RAPPORT_ECHEC + 1))
    RAPPORT_LISTE="${RAPPORT_LISTE}${slug} (prompt introuvable)\n"
    return 1
  fi

  local log_file="${LOG_DIR}/${slug}_${STAMP}.log"
  echo "[${STAMP}] Mise à jour de ${slug} → ${log_file}" >> "${MAJ_LOG}"

  # Capturer le timestamp avant le run
  local before_stamp
  before_stamp=$(stat -c %Y "${page}" 2>/dev/null || echo 0)
  local before_cards
  before_cards=$(grep -a -c 'class="news-card' "${page}" 2>/dev/null || echo 0)

  # Chrono du run (durée totale en secondes)
  local RUN_START=$SECONDS

  # Contrainte préfixée (conforme AGENTS.md)
  local CONSTRAINT
  CONSTRAINT="Limite stricte : max 6 appels webfetch, max 8 steps au total.
La phase de vérification des liens ne doit pas dépasser 30 secondes (utilise des appels parallèles).
Ne retry jamais sur un code 429. Considère le lien comme valide et passe à la suite.
Ne télécharge pas le HTML complet des pages YouTube.
Si Invidious échoue, ne réessaie pas (1 tentative max).
Après la recherche, édite le fichier IMMÉDIATEMENT.
Quand tu utilises l'outil bash pour une commande réseau (curl, noembed, etc.), spécifie timeout: 15000 dans l'appel à l'outil."

  local message
  message="${CONSTRAINT}

$(cat "${prompt}")"

  cd "${SITE_DIR}"
  # Variant minimal pour accélérer le raisonnement (pages pilotes)
  local VARIANT_FLAG=""
  if [[ "${slug}" == "boulevard-voltaire" || "${slug}" == "jacques-baud" || "${slug}" == "tocsin" || "${slug}" == "juste-milieu" || "${slug}" == "canard-refractaire" || "${slug}" == "profession-gendarme" || "${slug}" == "reinformation-sur-le-monde" || "${slug}" == "tv-libertes" || "${slug}" == "elucid-media" || "${slug}" == "frequence-populaire" || "${slug}" == "louis-fouche" || "${slug}" == "docteur-allwest" || "${slug}" == "guerre-israel-usa-iran" || "${slug}" == "epstein" || "${slug}" == "caroline-galacteros" || "${slug}" == "le-monde-moderne" || "${slug}" == "rtfrance-tv" || "${slug}" == "louis-de-dreslincourt" || "${slug}" == "le-media-en-442" || "${slug}" == "campagnol-tvl" || "${slug}" == "alain-soral" || "${slug}" == "xavier-poussard" || "${slug}" == "geopolitique-profonde" || "${slug}" == "radio-courtoisie" || "${slug}" == "brochu-tv" || "${slug}" == "asselineau" || "${slug}" == "idriss-aberkane" || "${slug}" == "xavier-moreau" || "${slug}" == "florian-philippot" || "${slug}" == "alexis-poulin" || "${slug}" == "odc-tv" || "${slug}" == "kate-tv" || "${slug}" == "jsuispascontent-tv" || "${slug}" == "nexus" || "${slug}" == "dialogue-franco-russe" || "${slug}" == "reseau-international" || "${slug}" == "omerta" || "${slug}" == "trouble-fait" || "${slug}" == "candace-owens-en-francais" || "${slug}" == "alexis-cossette" || "${slug}" == "aldo-sterone" || "${slug}" == "dieudonne" || "${slug}" == "sylvain-ferreira" || "${slug}" == "pierre-jovanovic" || "${slug}" == "affaire-brigitte" || "${slug}" == "covid-19" || "${slug}" == "guerre-ukraine-otan-russie" || "${slug}" == "youssef-hindi" || "${slug}" == "stratpol" || "${slug}" == "frontieres-media" || "${slug}" == "praxis" || "${slug}" == "france-soir" || "${slug}" == "egalite-et-reconciliation" || "${slug}" == "john-point-de-rupture" || "${slug}" == "antipresse" || "${slug}" == "beatrice-rosen" || "${slug}" == "censure-reseaux-sociaux" || "${slug}" == "chaque-jour-sur-terre" || "${slug}" == "jeremie-mercier" || "${slug}" == "pierre-de-gaulle" || "${slug}" == "nicolas-bouvier" || "${slug}" == "nicolas-vidal" || "${slug}" == "pierre-chaillot" || "${slug}" == "tatiana-ventose" ]]; then
    VARIANT_FLAG="--variant minimal"
  fi
  timeout 300 /home/alan/.opencode/bin/opencode run "${message}" --print-logs --log-level WARN ${VARIANT_FLAG} >> "${log_file}" 2>&1 || {
    echo "[${STAMP}] ÉCHEC ${slug} (voir ${log_file})" >> "${MAJ_LOG}"
  }

  # Durée du run (secondes)
  local RUN_DURATION=$((SECONDS - RUN_START))

  # Alerte log anormalement volumineux (boucle/erreur probable, ex: 186 Ko le 13/08)
  local LOG_SIZE
  LOG_SIZE=$(stat -c %s "${log_file}" 2>/dev/null || echo 0)
  if [[ "${LOG_SIZE}" -gt 50000 ]]; then
    echo "[${STAMP}] ANOMALIE ${slug} : log de ${LOG_SIZE} octets (voir ${log_file})" >> "${MAJ_LOG}"
    RAPPORT_ANOMALIES=$((RAPPORT_ANOMALIES + 1))
    RAPPORT_LISTE_ANOM="${RAPPORT_LISTE_ANOM}${slug} (log ${LOG_SIZE} octets)\n"
  fi

  # Bilan structuré émis par l'agent (lignes VERDICT/CARTES_*/ERREURS)
  parse_bilan "${log_file}"
  local BILAN=""
  if [[ -n "${VERDICT_VAR}" && "${VERDICT_VAR}" != "?" ]]; then
    BILAN=" | verdict=${VERDICT_VAR} | +${AJOUTS_VAR}/-${SUPPR_VAR} | total=${TOTAL_VAR} | erreurs=${ERREURS_VAR} | durée=${RUN_DURATION}s"
  fi

  # Vérifier que le fichier a été modifié
  local after_stamp
  after_stamp=$(stat -c %Y "${page}" 2>/dev/null || echo 0)

  if [[ "${before_stamp}" == "${after_stamp}" ]]; then
    # Fichier non modifié → vérifier si l'agent a signalé « page déjà à jour »
    if grep -qi "VERDICT=PAGE_A_JOUR" "${log_file}"; then
      echo "[${STAMP}] OK ${slug} (page déjà à jour)${BILAN}" >> "${MAJ_LOG}"
      RAPPORT_OK=$((RAPPORT_OK + 1))
      return 0
    fi

    # Fichier non modifié → retry édition seule (sans recherche web)
    if [[ ! -s "${page}" ]]; then
      echo "[${STAMP}] ÉCHEC ${slug} : fichier absent ou vide, pas de retry" >> "${MAJ_LOG}"
      RAPPORT_ECHEC=$((RAPPORT_ECHEC + 1))
      RAPPORT_LISTE="${RAPPORT_LISTE}${slug} (fichier absent)\n"
      return 1
    fi

    echo "[${STAMP}] ${slug} : fichier non modifié, retry édition seule..." >> "${MAJ_LOG}"
    local retry_msg
    retry_msg="Lis /home/alan/SITE/WEB/AGENTS.md (section « Règles d'affichage des cartes »)
et applique ses règles à ${page}.
Ne fais AUCUNE recherche web. Ajoute les vidéos récentes (moins de 28 jours)
qui manquent par rapport à la page, en utilisant les données déjà collectées.
Édite le fichier en conservant sa structure existante."

    timeout 60 /home/alan/.opencode/bin/opencode run "${retry_msg}" --print-logs --log-level WARN >> "${log_file}" 2>&1 || {
      echo "[${STAMP}] ÉCHEC RETRY ${slug} (voir ${log_file})" >> "${MAJ_LOG}"
      return 1
    }

    # Vérifier que le retry a bien modifié le fichier
    after_stamp=$(stat -c %Y "${page}" 2>/dev/null || echo 0)
    if [[ "${before_stamp}" != "${after_stamp}" ]]; then
      echo "[${STAMP}] OK ${slug} (retry édition)${BILAN}" >> "${MAJ_LOG}"
      RAPPORT_OK=$((RAPPORT_OK + 1))
    else
      echo "[${STAMP}] ÉCHEC ${slug} : fichier non modifié après retry" >> "${MAJ_LOG}"
      RAPPORT_ECHEC=$((RAPPORT_ECHEC + 1))
      RAPPORT_LISTE="${RAPPORT_LISTE}${slug} (non modifié après retry)\n"
      return 1
    fi
  else
    local after_cards
    after_cards=$(grep -a -c 'class="news-card' "${page}" 2>/dev/null || echo 0)
    if [[ -z "${TOTAL_VAR}" || "${TOTAL_VAR}" == "?" ]]; then
      TOTAL_VAR="${after_cards}"
    fi
    echo "[${STAMP}] OK ${slug}${BILAN} (${before_cards} → ${after_cards} cartes)" >> "${MAJ_LOG}"
    RAPPORT_OK=$((RAPPORT_OK + 1))
  fi
}

SLUGS=()
case "${1:-}" in
  --all)
    SLUGS=(
        tocsin geopolitique-profonde tv-libertes radio-courtoisie brochu-tv jsuispascontent-tv le-media-en-442 nexus odc-tv campagnol-tvl dialogue-franco-russe france-soir egalite-et-reconciliation john-point-de-rupture kate-tv juste-milieu frequence-populaire rtfrance-tv reseau-international boulevard-voltaire
        asselineau idriss-aberkane jacques-baud caroline-galacteros nicolas-bouvier
        alexis-cossette dieudonne pierre-jovanovic
    xavier-moreau xavier-poussard florian-philippot
         alexis-poulin alain-soral nicolas-vidal pierre-chaillot covid-19 louis-fouche jeremie-mercier
             epstein affaire-brigitte youssef-hindi sylvain-ferreira aldo-sterone beatrice-rosen omerta canard-refractaire profession-gendarme trouble-fait guerre-israel-usa-iran guerre-ukraine-otan-russie censure-reseaux-sociaux stratpol praxis frontieres-media elucid-media le-monde-moderne louis-de-dreslincourt antipresse chaque-jour-sur-terre candace-owens-en-francais tatiana-ventose pierre-de-gaulle
    )
    ;;
  "")
    echo "Usage: $0 <slug|--all>" >&2
    exit 1
    ;;
  *)
    SLUGS=("$@")
    ;;
esac

for slug in "${SLUGS[@]}"; do
  run_update "${slug}" || true
done

echo "[${STAMP}] Fin du cycle de mise à jour" >> "${MAJ_LOG}"

# Rapport quotidien
{
  echo "=== RAPPORT DU ${STAMP} ==="
  echo "OK: ${RAPPORT_OK}  ÉCHEC: ${RAPPORT_ECHEC}  ANOMALIES: ${RAPPORT_ANOMALIES}"
  if [[ -n "${RAPPORT_LISTE}" ]]; then
    echo ""
    echo "Pages en échec :"
    echo -e "${RAPPORT_LISTE}"
  fi
  if [[ -n "${RAPPORT_LISTE_ANOM}" ]]; then
    echo ""
    echo "Logs anormalement volumineux (> 50 Ko, boucle probable) :"
    echo -e "${RAPPORT_LISTE_ANOM}"
  fi
  echo "================================"
  echo ""
} >> "${RAPPORT_LOG}"