#!/usr/bin/env python3
"""
Client fixe pour la file veille CGP-Perplexity (webhook veille-cgp-queue), utilisé
par la routine ROUTINE-VEILLE-CGP-HEBDO.md.

Même pattern que veille_queue_client.py : réutilise N8N_HOST et FIDULIA_TOKEN
(même instance n8n, même token webhook), chemin d'endpoint différent.

Usage:
    python3 veille_cgp_queue_client.py fetch
        -> GET {N8N_HOST}/webhook/veille-cgp-queue, imprime le JSON reçu sur stdout
           et l'écrit aussi dans .cache/veille-cgp-queue-latest.json

    python3 veille_cgp_queue_client.py done --item-ids id1,id2,... [--traite-par 50]
        -> POST {N8N_HOST}/webhook/veille-cgp-queue/done avec {"itemIds": [...], "traitePar": "..."}
"""
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-cgp-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-cgp-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-cgp-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(item_ids, traite_par):
    host, token = get_env()
    payload = json.dumps({"itemIds": item_ids, "traitePar": traite_par}, ensure_ascii=False).encode("utf-8")
    req = urllib.request.Request(
        f"{host}/webhook/veille-cgp-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-cgp-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 les items CGP en attente")

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

    args = parser.parse_args()

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


if __name__ == "__main__":
    main()
