#!/usr/bin/env python3
"""Outils de manipulation du lot de veille (cache JSON de la file n8n).

Remplace les snippets `python3 -c` improvisés pendant la routine du matin :
tout Bash ad hoc non wildcardé dans settings.json bloque la routine sur un
prompt d'autorisation (doctrine 15/07/2026 — script fixe + permission dédiée).
Ce script est couvert par la règle Bash(python3 .../70-Agent-Automatisation/scripts/*).

Usage :
  veille_lot_tools.py stats            # total, uniques, doublons, rôles présents
  veille_lot_tools.py ids              # postId uniques en CSV (pour l'étape 4 done)
  veille_lot_tools.py dump [--out F]   # dump markdown lisible dédupliqué (600 car./post)

Entrée par défaut : routine/.cache/veille-queue-latest.json (écrit par
veille_queue_client.py fetch). Sortie dump par défaut :
routine/.cache/lot-dump-latest.md (chemin fixe du repo, lisible via Read).
"""

import argparse
import json
import sys
from pathlib import Path

BASE = Path(__file__).resolve().parent.parent / "routine" / ".cache"
DEFAULT_IN = BASE / "veille-queue-latest.json"
DEFAULT_OUT = BASE / "lot-dump-latest.md"


def load_unique(path: Path):
    data = json.loads(path.read_text(encoding="utf-8"))
    posts = data["posts"] if isinstance(data, dict) else data
    seen, unique = set(), []
    for p in posts:
        pid = str(p.get("postId", ""))
        if pid and pid not in seen:
            seen.add(pid)
            unique.append(p)
    return posts, unique


def main():
    ap = argparse.ArgumentParser(description=__doc__)
    ap.add_argument("action", choices=["stats", "ids", "dump"])
    ap.add_argument("--in", dest="infile", default=str(DEFAULT_IN))
    ap.add_argument("--out", dest="outfile", default=str(DEFAULT_OUT))
    ap.add_argument("--chars", type=int, default=600, help="longueur max du texte par post dans le dump")
    args = ap.parse_args()

    infile = Path(args.infile)
    if not infile.exists():
        print(f"ERREUR: fichier introuvable: {infile}", file=sys.stderr)
        sys.exit(1)

    posts, unique = load_unique(infile)

    if args.action == "stats":
        roles = {}
        for p in unique:
            roles[str(p.get("role", "<absent>")) or "<vide>"] = roles.get(str(p.get("role", "<absent>")) or "<vide>", 0) + 1
        print(f"posts reçus   : {len(posts)}")
        print(f"posts uniques : {len(unique)}")
        print(f"doublons      : {len(posts) - len(unique)}")
        print(f"rôles         : {roles}")

    elif args.action == "ids":
        print(",".join(str(p["postId"]) for p in unique))

    elif args.action == "dump":
        out = Path(args.outfile)
        lines = []
        for i, p in enumerate(unique, 1):
            role = p.get("role", "")
            role_str = f" | role={role}" if role else ""
            lines.append(
                f"### {i}. {p.get('author', 'Inconnu')} | postId={p['postId']}{role_str} | "
                f"likes={p.get('likes', 0)} comments={p.get('comments', 0)} | {p.get('postedAt', '')}\n"
                f"URL: {p.get('url', '')}\n"
                f"TEXTE: {(p.get('text') or '')[:args.chars]}\n"
            )
        out.write_text("\n".join(lines), encoding="utf-8")
        print(f"dump écrit : {out} ({len(unique)} posts uniques)")


if __name__ == "__main__":
    main()
