#!/usr/bin/env python3
"""Met à jour uniquement le ZIP téléchargeable d'une fiche produit WooCommerce (variable)."""

from __future__ import annotations

import argparse
import json
import sys
import uuid
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "scripts"))

from article_studio.config import load_config
from article_studio.wp_client import _request, upload_media


def get_json(base: str, user: str, pwd: str, path: str) -> dict | list:
    _, data = _request("GET", f"{base.rstrip('/')}{path}", user, pwd)
    return data


def put_json(base: str, user: str, pwd: str, path: str, payload: dict) -> dict:
    _, data = _request(
        "PUT",
        f"{base.rstrip('/')}{path}",
        user,
        pwd,
        data=json.dumps(payload).encode("utf-8"),
        headers={"Content-Type": "application/json"},
    )
    return data


def main() -> int:
    parser = argparse.ArgumentParser(description="Upload ZIP sur fiche produit WC (sans autre modification)")
    parser.add_argument("--product-id", type=int, required=True)
    parser.add_argument("--zip", type=Path, required=True)
    parser.add_argument("--sku", required=True)
    parser.add_argument("--download-name", required=True)
    parser.add_argument("--download-id", default="")
    args = parser.parse_args()

    if not args.zip.is_file():
        raise FileNotFoundError(args.zip)

    cfg = load_config()
    base = cfg.wp_base_url
    user = cfg.wp_user
    pwd = cfg.wp_application_password.replace(" ", "")

    download_id = args.download_id or f"dl-{args.product_id}-{uuid.uuid4().hex[:8]}"
    print(f"Produit #{args.product_id} — upload {args.zip.name}…")

    media = upload_media(base, user, pwd, args.zip, alt_text=args.download_name, title=args.download_name)
    zip_url = media.get("source_url") or media.get("guid", {}).get("rendered", "")
    downloads = [{"id": download_id, "name": args.download_name, "file": zip_url}]
    print(f"  URL : {zip_url}")

    put_json(
        base,
        user,
        pwd,
        f"/wp-json/wc/v3/products/{args.product_id}",
        {"sku": args.sku, "downloads": downloads},
    )

    variations = get_json(base, user, pwd, f"/wp-json/wc/v3/products/{args.product_id}/variations?per_page=100")
    if isinstance(variations, list):
        for var in variations:
            vid = int(var["id"])
            put_json(
                base,
                user,
                pwd,
                f"/wp-json/wc/v3/products/{args.product_id}/variations/{vid}",
                {"downloadable": True, "downloads": downloads},
            )
            print(f"  variation #{vid} OK")

    print("Terminé.")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
