#!/usr/bin/env python3
"""Met à jour la fiche produit WooCommerce amquestions (ZIP + changelog + JSON-LD)."""

from __future__ import annotations

import json
import sys
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

ASSETS = ROOT / "exports" / "amquestions-product"
VERSION = "1.1.0"
ZIP_PATH = ASSETS / f"amquestions-{VERSION}.zip"
PRODUCT_ID = 15756
SLUG = "module-prestashop-faq-questions-frequentes"
SKU = f"amquestions-{VERSION}"
DOWNLOAD_NAME = f"module-faq-questions-frequentes-prestashop-{VERSION}"

CHANGELOG_ENTRY = (
    f"<h3>Version {VERSION} — 02/09/2026</h3><ul>"
    "<li>Balisage automatique <strong>schema.org FAQPage</strong> en JSON-LD sur les pages où la FAQ s’affiche</li>"
    "<li>Le marquage reprend uniquement les questions/réponses visibles (catégories, marques, liste des marques)</li></ul>"
)

SEO_LI_JSONLD = (
    "<li>balisage <strong>FAQPage JSON-LD</strong> (schema.org) injecté automatiquement "
    "sur les pages catégorie et marque qui affichent une FAQ,</li>"
)

SHORT_DESCRIPTION = (
    "Affichez des FAQ en accordéon sur vos pages catégories et marques PrestaShop, "
    "avec balisage FAQPage JSON-LD. Gestion multilingue et assignation par catégorie."
)

YOAST_METADESC = (
    "Module PrestaShop FAQ en accordéon sur catégories et marques, avec balisage FAQPage JSON-LD. "
    "Gestion multilingue. Compatible PS 8 à 9."
)


def get_json(base_url: str, user: str, password: str, path: str):
    url = f"{base_url.rstrip('/')}{path}"
    _, data = _request("GET", url, user, password)
    return data


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


def inject_seo_jsonld(description: str) -> str:
    if "FAQPage JSON-LD" in description:
        return description
    needle = "<h2>SEO et conversion</h2>\n<ul>\n<li>contenu riche"
    replacement = "<h2>SEO et conversion</h2>\n<ul>\n" + SEO_LI_JSONLD + "\n<li>contenu riche"
    if needle in description:
        return description.replace(needle, replacement, 1)
    return description


def main() -> int:
    if not ZIP_PATH.is_file():
        raise FileNotFoundError(f"Archive introuvable : {ZIP_PATH}")

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

    product = get_json(base, user, pwd, f"/wp-json/wc/v3/products/{PRODUCT_ID}")
    if not isinstance(product, dict):
        raise RuntimeError("Réponse produit invalide")

    description = inject_seo_jsonld(product.get("description") or "")
    meta = {m["key"]: m.get("value") for m in product.get("meta_data", []) if isinstance(m, dict)}
    changelog = (meta.get("changelog") or "").strip()
    if CHANGELOG_ENTRY not in changelog:
        changelog = CHANGELOG_ENTRY + changelog

    print(f"Produit #{PRODUCT_ID} — upload ZIP…")
    zip_media = upload_media(
        base,
        user,
        pwd,
        ZIP_PATH,
        alt_text=f"Module PrestaShop FAQ questions fréquentes v{VERSION}",
        title=DOWNLOAD_NAME,
    )
    zip_url = zip_media.get("source_url") or zip_media.get("guid", {}).get("rendered", "")
    downloads = [{"id": "amquestions-dl", "name": DOWNLOAD_NAME, "file": zip_url}]
    print(f"  ZIP : {zip_url}")

    put_json(
        base,
        user,
        pwd,
        f"/wp-json/wc/v3/products/{PRODUCT_ID}",
        {
            "sku": SKU,
            "description": description,
            "short_description": SHORT_DESCRIPTION,
            "downloads": downloads,
            "meta_data": [
                {"key": "derniere_mise_a_jour", "value": "20260902"},
                {"key": "version_du_module__theme", "value": "V1.1.0"},
                {"key": "changelog", "value": changelog},
                {"key": "_yoast_wpseo_metadesc", "value": YOAST_METADESC},
                {
                    "key": "infos_demo",
                    "value": (
                        "Module installé sur la démo. Configuration : Modules → (AM) Frequently asked questions. "
                        "Exemple : page catégorie Clothes. Le JSON-LD FAQPage est présent dans le code source de la page."
                    ),
                },
            ],
        },
    )

    variations = get_json(base, user, pwd, f"/wp-json/wc/v3/products/{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/{PRODUCT_ID}/variations/{vid}",
                {"downloadable": True, "downloads": downloads},
            )
            print(f"  variation #{vid} mise à jour")

    print(f"\nFiche produit mise à jour : {base}/produit/{SLUG}/")
    return 0


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