#!/usr/bin/env python3
"""
Client fixe pour la file veille n8n (webhook veille-queue), utilisé par la
routine ROUTINE-VEILLE-MATIN.md (étapes 1 et 4).

Lit N8N_HOST et FIDULIA_TOKEN depuis l'environnement si déjà exportés,
sinon charge directement ~/.config/fidulia/veille.env (plus besoin de
`source` en Bash avant l'appel — évite le prompt d'approbation systématique
que Claude Code impose sur le builtin `source`, même avec une règle allow).

Usage:
    python3 veille_queue_client.py fetch
        -> GET {N8N_HOST}/webhook/veille-queue, imprime le JSON reçu sur stdout
           et l'écrit aussi dans .cache/veille-queue-latest.json (chemin fixe
           du repo, pour éviter de dépendre du fichier tool-results éphémère
           du harness quand la réponse est volumineuse)

    python3 veille_queue_client.py done --post-ids id1,id2,... [--traite-par 42,50]
        -> POST {N8N_HOST}/webhook/veille-queue/done avec {"postIds": [...], "traitePar": "..."}

Remplace les appels curl bruts, afin que la permission Bash puisse être
scopée à ce script exact plutôt qu'à curl dans son ensemble (curl illimité
= sortie réseau non bornée vers n'importe quelle destination).
"""
import argparse
import json
import os
import sys
import urllib.request
import urllib.error

ENV_FILE = os.path.expanduser("~/.config/fidulia/veille.env")
CACHE_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "routine", ".cache", "veille-queue-latest.json")


def load_env_file(path):
    """Parse un fichier shell simple (export KEY=VALUE) sans dépendre de `source`."""
    values = {}
    try:
        with open(path, "r", encoding="utf-8") as f:
            for line in f:
                line = line.strip()
                if not line or line.startswith("#"):
                    continue
                if line.startswith("export "):
                    line = line[len("export "):]
                if "=" not in line:
                    continue
                key, _, val = line.partition("=")
                values[key.strip()] = val.strip().strip('"').strip("'")
    except OSError:
        pass
    return values


def get_env():
    host = os.environ.get("N8N_HOST")
    token = os.environ.get("FIDULIA_TOKEN")
    if not host or not token:
        file_values = load_env_file(ENV_FILE)
        host = host or file_values.get("N8N_HOST")
        token = token or file_values.get("FIDULIA_TOKEN")
    if not host or not token:
        print(f"N8N_HOST et FIDULIA_TOKEN introuvables (ni dans l'environnement, "
              f"ni dans {ENV_FILE}).", file=sys.stderr)
        sys.exit(1)
    return host.rstrip("/"), token


def do_fetch():
    host, token = get_env()
    req = urllib.request.Request(
        f"{host}/webhook/veille-queue",
        headers={"X-Fidulia-Token": token},
        method="GET",
    )
    try:
        with urllib.request.urlopen(req, timeout=30) as resp:
            body = resp.read().decode("utf-8")
    except urllib.error.URLError as e:
        print(f"Erreur fetch veille-queue: {e}", file=sys.stderr)
        sys.exit(1)
    print(body)
    try:
        os.makedirs(os.path.dirname(CACHE_FILE), exist_ok=True)
        with open(CACHE_FILE, "w", encoding="utf-8") as f:
            f.write(body)
    except OSError as e:
        print(f"Avertissement : écriture cache impossible ({e}).", file=sys.stderr)


def do_done(post_ids, traite_par):
    host, token = get_env()
    payload = json.dumps({"postIds": post_ids, "traitePar": traite_par}, ensure_ascii=False).encode("utf-8")
    req = urllib.request.Request(
        f"{host}/webhook/veille-queue/done",
        data=payload,
        headers={"X-Fidulia-Token": token, "Content-Type": "application/json"},
        method="POST",
    )
    try:
        with urllib.request.urlopen(req, timeout=30) as resp:
            print(resp.read().decode("utf-8"))
    except urllib.error.URLError as e:
        print(f"Erreur POST veille-queue/done: {e}", file=sys.stderr)
        sys.exit(1)


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    sub = parser.add_subparsers(dest="mode", required=True)

    sub.add_parser("fetch", help="Récupère la file de posts en attente")

    done_parser = sub.add_parser("done", help="Marque des postId comme traités")
    done_parser.add_argument("--post-ids", required=True, help="Liste de postId séparés par des virgules")
    done_parser.add_argument("--traite-par", default="42,50", help="Valeur du champ traitePar (défaut: 42,50)")

    args = parser.parse_args()

    if args.mode == "fetch":
        do_fetch()
    elif args.mode == "done":
        post_ids = [p.strip() for p in args.post_ids.split(",") if p.strip()]
        if not post_ids:
            print("Aucun postId fourni.", file=sys.stderr)
            sys.exit(1)
        do_done(post_ids, args.traite_par)


if __name__ == "__main__":
    main()
