#!/usr/bin/env python3
"""Met à jour la fiche Choose publiée : prix x2, v4.3.0, supprime le brouillon doublon."""

from __future__ import annotations

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

PRODUCT_ID = 15738
DRAFT_DUPLICATE_ID = 15935
ASSETS = ROOT / "exports" / "amchoose-product"
ZIP_PATH = ASSETS / "amchoose-4.3.0.zip"
SKU = "amchoose-4.3.0"
DOWNLOAD_NAME = "module-synchronisation-choose-prestashop-4.3.0"

PRODUCT_NAME = (
    "Module PrestaShop synchronisation Choose — Import commandes marketplace et suivi colis"
)

SHORT_DESCRIPTION = (
    "Connectez Choose à PrestaShop : import automatique des commandes marketplace, "
    "création client et commande, remontée des numéros de suivi vers Choose via cron."
)

DESCRIPTION_HTML = """<h2>Vous vendez sur Choose ? Arrêtez de ressaisir les commandes à la main</h2>
<p>Chaque vente Choose = une commande à recopier dans PrestaShop, un client à créer, un statut à suivre, un numéro de colis à remonter sur la marketplace. Ce module automatise tout le flux, dans les deux sens.</p>
<p><strong>Import</strong> : les commandes Choose arrivent dans PrestaShop avec les bons montants, adresses et lignes produits.<br>
<strong>Export</strong> : dès que vous expédiez depuis PrestaShop, le numéro de suivi remonte sur Choose via l'API.</p>

<h2>Ce que le module fait concrètement</h2>
<ul>
<li>récupère les commandes Choose (filtre NOT_PROCESSED, PROCESSED, ALL ou BLOCKED),</li>
<li>crée ou met à jour clients, adresses, paniers et commandes PrestaShop,</li>
<li>applique groupe client, devise, transporteur et statut par défaut configurables,</li>
<li>envoie les numéros de suivi vers Choose (API createParcel) après expédition,</li>
<li>affiche un lien direct vers la commande Choose depuis la fiche commande back-office,</li>
<li>conserve une table de correspondance Choose ↔ PrestaShop pour la traçabilité.</li>
</ul>

<h2>Tableau de bord back-office repensé</h2>
<p>Interface de configuration native PrestaShop avec :</p>
<ul>
<li>statistiques en temps réel (commandes synchronisées, suivis en attente, logs),</li>
<li>schéma visuel du flux Import CRON → Expédition → Export CRON,</li>
<li>clé webservice PrestaShop générée automatiquement à l'installation,</li>
<li>mode dry-run développeur pour simuler import/export sans toucher aux données,</li>
<li>rapport détaillé de simulation (commandes à créer, déjà importées, produits manquants).</li>
</ul>

<h2>Cron, CLI et logs</h2>
<p>Deux tâches planifiables, déclenchables manuellement ou via cron :</p>
<ul>
<li><strong>Import orders</strong> — récupère les nouvelles commandes Choose,</li>
<li><strong>Update orders</strong> — remonte les suivis colis vers Choose.</li>
</ul>
<p>URLs cron copiables en un clic, variantes CLI pour hébergements restreints, logs consultables depuis l'interface. Paramètre <code>&amp;dry_run=1</code> pour tester sans risque.</p>

<h2>Prérequis</h2>
<ul>
<li>extension PHP <strong>cURL</strong> activée,</li>
<li>compte Choose avec clé API et Sale ID,</li>
<li>webservice PrestaShop (activé automatiquement à l'installation).</li>
</ul>

<h2>Compatibilité</h2>
<ul>
<li>PrestaShop <strong>1.6 à 8</strong> (toutes versions mineures),</li>
<li>multiboutique supporté (configuration par boutique),</li>
<li>migration automatique depuis l'ancien module de paiement amchoosepayment.</li>
</ul>

<h2>Conclusion</h2>
<p>Ce connecteur Choose pour PrestaShop vous fait gagner des heures chaque semaine sur la gestion marketplace : zéro ressaisie, suivi colis fiable, pilotage cron ou manuel selon vos besoins.</p>
<p>Livraison immédiate du ZIP après achat, avec licence et mises à jour selon la durée choisie.</p>"""

YOAST_TITLE = "Module PrestaShop synchronisation Choose | Import commandes marketplace"
YOAST_METADESC = (
    "Module PrestaShop pour synchroniser Choose : import automatique des commandes marketplace, "
    "remontée des numéros de suivi, cron planifiable et mode dry-run. Compatible PS 1.6 à 8."
)
YOAST_FOCUS = "Module PrestaShop synchronisation Choose"

VARIATIONS = [
    ("6 mois", "99.94"),
    ("12 mois (25% d'économie)", "174.895"),
    ("24 mois (54% d'économie)", "195.8824"),
]

CHANGELOG = (
    "<h3>Version 4.3.0 — 11/06/2026</h3><ul>"
    "<li>Mode dry-run développeur avec rapport détaillé import/export</li>"
    "<li>Tableau de bord back-office repensé (stats, flux visuel)</li>"
    "<li>URLs cron dry-run et boutons de test intégrés</li></ul>"
    "<h3>Version 4.2.0</h3><ul>"
    "<li>Styles back-office dédiés (CSS/JS admin)</li>"
    "<li>Hook displayBackOfficeHeader pour l'interface modernisée</li></ul>"
    "<h3>Version 4.1.1</h3><ul>"
    "<li>Migration automatique depuis amchoosepayment</li></ul>"
    "<h3>Version 4.0.0</h3><ul>"
    "<li>Compatibilité PrestaShop 8.x</li>"
    "<li>Import / update commandes Choose via API</li>"
    "<li>Tâches cron et logs intégrés</li>"
    "<li>Lien direct Choose sur fiche commande BO</li></ul>"
)


def request_json(method: str, base: str, user: str, pwd: str, path: str, payload: dict | None = None) -> dict:
    url = f"{base.rstrip('/')}{path}"
    data = json.dumps(payload).encode("utf-8") if payload is not None else None
    headers = {"Content-Type": "application/json"} if data else {}
    _, body = _request(method, url, user, pwd, data=data, headers=headers)
    return body


def main() -> None:
    cfg = load_config()
    base = cfg.wp_base_url
    user = cfg.wp_user
    pwd = cfg.wp_application_password.replace(" ", "")

    print(f"Suppression du brouillon doublon (id={DRAFT_DUPLICATE_ID})…")
    try:
        request_json("DELETE", base, user, pwd, f"/wp-json/wc/v3/products/{DRAFT_DUPLICATE_ID}", {"force": True})
        print("  brouillon supprimé")
    except RuntimeError as e:
        print(f"  avertissement: {e}")

    if not ZIP_PATH.is_file():
        raise FileNotFoundError(f"Archive introuvable : {ZIP_PATH}")

    print("Upload du ZIP v4.3.0…")
    zip_media = upload_media(
        base,
        user,
        pwd,
        ZIP_PATH,
        alt_text="Module PrestaShop synchronisation Choose v4.3.0",
        title=DOWNLOAD_NAME,
    )
    zip_url = zip_media.get("source_url") or zip_media.get("guid", {}).get("rendered", "")
    downloads = [{"id": str(uuid.uuid4()), "name": DOWNLOAD_NAME, "file": zip_url}]

    print(f"Mise à jour du produit {PRODUCT_ID}…")
    product = request_json(
        "PUT",
        base,
        user,
        pwd,
        f"/wp-json/wc/v3/products/{PRODUCT_ID}",
        {
            "name": PRODUCT_NAME,
            "description": DESCRIPTION_HTML,
            "short_description": SHORT_DESCRIPTION,
            "sku": SKU,
            "downloads": downloads,
            "meta_data": [
                {"key": "_yoast_wpseo_title", "value": YOAST_TITLE},
                {"key": "_yoast_wpseo_metadesc", "value": YOAST_METADESC},
                {"key": "_yoast_wpseo_focuskw", "value": YOAST_FOCUS},
                {"key": "derniere_mise_a_jour", "value": "20260611"},
                {"key": "version_du_module__theme", "value": "V4.3.0"},
                {"key": "changelog", "value": CHANGELOG},
                {
                    "key": "infos_demo",
                    "value": (
                        "Module installé sur la démo. Configuration : Modules → (AM) Choose. "
                        "Nécessite une clé API Choose et un Sale ID pour tester l'import réel. "
                        "Le mode dry-run permet de simuler sans credentials."
                    ),
                },
            ],
        },
    )

    print("Mise à jour des variations (prix x2)…")
    for var in product.get("variations", []):
        var_id = var if isinstance(var, int) else var.get("id")
        if not var_id:
            continue
        var_data = request_json("GET", base, user, pwd, f"/wp-json/wc/v3/products/{PRODUCT_ID}/variations/{var_id}")
        label = var_data["attributes"][0]["option"]
        price = next((p for opt, p in VARIATIONS if opt == label), None)
        if not price:
            print(f"  variation {var_id}: libellé inconnu « {label} »")
            continue
        request_json(
            "PUT",
            base,
            user,
            pwd,
            f"/wp-json/wc/v3/products/{PRODUCT_ID}/variations/{var_id}",
            {"regular_price": price, "downloads": downloads},
        )
        print(f"  variation {var_id}: {label} → {price} €")

    try:
        request_json(
            "PUT",
            base,
            user,
            pwd,
            f"/wp-json/wp/v2/product/{PRODUCT_ID}",
            {"excerpt": SHORT_DESCRIPTION},
        )
    except RuntimeError as e:
        print(f"  avertissement excerpt: {e}")

    print("\n--- Terminé ---")
    print(f"Produit : {base}/produit/module-prestashop-synchronisation-choose/")
    print(f"Édition : {base}/wp-admin/post.php?post={PRODUCT_ID}&action=edit")


if __name__ == "__main__":
    main()
