#!/usr/bin/env python3
"""Met à jour la fiche WooCommerce export comptable (id 7949) : ZIP 3.9.3, changelog, meta ACF."""

from __future__ import annotations

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

PRODUCT_ID = 7949
ASSETS = ROOT / "exports" / "amexportcompta-product"
VERSION = "3.9.6"
ZIP_PATH = ASSETS / f"amexportcompta-{VERSION}.zip"
SKU = f"amexportcompta-{VERSION}"
DOWNLOAD_NAME = f"module-export-comptable-prestashop-{VERSION}"

NEW_VERSION_BLOCKS = [
    (
        "3.9.6",
        [
            "[NOUVEAUTÉ] export ABBY : sélection d’un ou plusieurs statuts de commande à exporter (export manuel et cron)",
            "[AMELIORATION] export ABBY : message d’aide si l’export est vide (statuts exclus, dates, contexte boutique)",
            "[DEBUG] licence : vérification en direct à chaque affichage du module (sans cache), classe dédiée et multi-domaines",
        ],
    ),
    (
        "3.9.5",
        [
            "[DEBUG] corrections mineures",
        ],
    ),
    (
        "3.9.4",
        [
            "[DEBUG] corrections mineures",
        ],
    ),
    (
        "3.9.3",
        [
            "[DEBUG] bouton Mes licences : lien externe corrigé dans le back-office PrestaShop",
            "[AMELIORATION] traductions françaises de l’onglet Enregistrement et des messages de licence",
        ],
    ),
    (
        "3.9.2",
        [
            "[AMELIORATION] enregistrement licence : bouton « Mes licences » vers le portail client, suppression de la demande de clé par email",
            "[DEBUG] lien Mes licences : URL corrigée pour éviter une 404 sur la boutique",
        ],
    ),
    (
        "3.9.1",
        [
            "[AMELIORATION] export ABBY : un seul type de vente global (suppression du choix par catégorie et du type frais de port)",
            "[AMELIORATION] export ABBY : une ligne par facture avec les totaux HT/TTC de la commande",
            "[DEBUG] export ABBY manuel : correction de la soumission du formulaire, retour sur l’onglet ABBY après export et normalisation des dates",
        ],
    ),
    (
        "3.9.0",
        [
            "[NOUVEAUTÉ] export ABBY : nouvel onglet de configuration avec export manuel par période de dates de paiement",
            "[NOUVEAUTÉ] export ABBY : configuration du type de vente (1 à 4) par catégorie avec application en masse",
            "[NOUVEAUTÉ] export ABBY : tâche planifiée (cron) pour exporter automatiquement le mois précédent",
            "[NOUVEAUTÉ] export ABBY : format CSV conforme au modèle ABBY (montants avec point décimal)",
        ],
    ),
    (
        "3.8.7",
        [
            "[DEBUG] pièce jointe mail des exports planifiés : réutilisation du chemin et du nom du fichier CSV créé par createFile()",
            "[DEBUG] export des avoirs : exclusion des avoirs déjà exportés avec leur commande dans le bloc des avoirs indépendants",
        ],
    ),
    (
        "3.8.6",
        [
            "[DEBUG] colonne TVA : column_tva corrigé en column_vat dans getColumnsOrder()",
            "[DEBUG] onglet Ordre des colonnes : le drag & drop n'écrase plus les cases à cocher",
            "[FEATURE] hooks d'extension : actionAmExportComptaDefaultColumnsModifier, actionAmExportComptaColumnsModifier, actionAmExportComptaHeaderLineModifier, actionAmExportComptaExportLineModifier",
        ],
    ),
    (
        "3.8.5",
        [
            "[DEBUG] export des avoirs avec frais de port : initialisation du compte livraison alignée sur les commandes",
            "[DEBUG] conformité PrestaShop Addons : garde if (!defined('_PS_VERSION_')) sur cron.php et helpers",
        ],
    ),
    (
        "3.8.4",
        [
            "[DEBUG] chargement de AECfunctions.php en require_once pour éviter « class already in use » via cron.php",
        ],
    ),
    (
        "3.8.3",
        [
            "[DEBUG] accès HTTP à cron.php : exception .htaccess du module (403 Apache sous PS 8+)",
        ],
    ),
    (
        "3.8.2",
        [
            "[DEBUG] compatibilité PrestaShop 9 : remplacement de Tools::encrypt() par Tools::hash() avec repli",
        ],
    ),
    (
        "3.8.1",
        [
            "[DEBUG] compatibilité PHP 5.3+ et 8.x : filtre transporteurs via réflexion sur Carrier::ALL_CARRIERS",
        ],
    ),
    (
        "3.8.0",
        [
            "[NOUVEAUTÉ] comptes de paiement : mode un compte par moyen de paiement ou par pays",
            "[NOUVEAUTÉ] export optionnel format grille Saisie standard Cegid Quadra",
            "[DEBUG] export des avoirs sans commande dans la période : pays livraison et compte de paiement",
        ],
    ),
    (
        "3.7.2",
        [
            "[DEBUG] correction export avoirs : compte TVA sur lignes taxes livraison",
            "[AMELIORATION] fallback compte TVA par défaut pour taxe livraison",
        ],
    ),
    (
        "3.7.0",
        [
            "[NOUVEAUTÉ] bouton supprimer tous les exports",
            "[NOUVEAUTÉ] demande de clé de licence depuis l’interface",
            "[AMELIORATION] sécurité : email de destination crypté",
        ],
    ),
]


def _changelog_version_block(version: str, lines: list[str]) -> str:
    body = "<br />\n".join(lines)
    return f"<p>Version {version} :<br />\n{body}</p>"


def build_changelog() -> str:
    return "\n".join(_changelog_version_block(v, lines) for v, lines in NEW_VERSION_BLOCKS)


YOAST_TITLE = "Module PrestaShop export comptable CSV - Compatible PS 1.7 à 9"
YOAST_METADESC = (
    "Export comptable PrestaShop en CSV : comptes, TVA, avoirs, format Cegid Quadra et export ABBY. "
    "Licence par domaine, compatible PrestaShop 1.7 à 9. Version 3.9.6."
)
YOAST_FOCUS = "Module PrestaShop export comptable"
PS_VERSIONS_LABEL = "v1.7 à v9 toutes versions"

DESCRIPTION_REPLACEMENTS = (
    (
        "compatible avec PrestaShop de la version 1.5 à 9.X.X",
        "compatible avec PrestaShop de la version 1.7 à 9",
    ),
    (
        "compatible avec PrestaShop de la version 1.6 à 9",
        "compatible avec PrestaShop de la version 1.7 à 9",
    ),
    (
        "Version 3.9.1",
        f"Version {VERSION}",
    ),
    (
        "version 3.9.1",
        f"version {VERSION}",
    ),
    (
        "Mise à jour 3.9.1",
        f"Mise à jour {VERSION}",
    ),
    (
        "version <strong>3.9.1</strong>",
        f"version <strong>{VERSION}</strong>",
    ),
    (
        "version <strong>3.8.7</strong>",
        f"version <strong>{VERSION}</strong>",
    ),
    (
        "Mise à jour 3.8.7",
        f"Mise à jour {VERSION}",
    ),
)


def normalize_product_description(html: str) -> str:
    for old, new in DESCRIPTION_REPLACEMENTS:
        html = html.replace(old, new)
    html = re.sub(
        r"version\s*<strong>\d+\.\d+\.\d+</strong>",
        f"version <strong>{VERSION}</strong>",
        html,
        flags=re.I,
    )
    html = re.sub(
        r"<h3>Activation de la licence</h3>\s*<p>.*?</p>",
        "",
        html,
        flags=re.S,
    )
    if "export ABBY" not in html and "ABBY" not in html:
        abby_block = (
            "<h3>Export ABBY</h3>"
            "<p>Depuis la version 3.9, le module propose un onglet dédié pour générer un export CSV "
            "conforme au modèle ABBY : export manuel par période de dates de paiement, type de vente "
            "global configurable et export automatique mensuel via cron.</p>"
        )
        if "<h2" in html:
            html = html.replace("<h2", abby_block + "<h2", 1)
        else:
            html += abby_block
    return html


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 main() -> None:
    if not ZIP_PATH.is_file():
        raise FileNotFoundError(f"ZIP introuvable : {ZIP_PATH} — lancer package_amexportcompta.py")

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

    print("Upload du ZIP…")
    zip_media = upload_media(
        base,
        user,
        pwd,
        ZIP_PATH,
        alt_text=f"Module PrestaShop export comptable v{VERSION}",
        title=DOWNLOAD_NAME,
    )
    zip_url = zip_media.get("source_url") or zip_media.get("guid", {}).get("rendered", "")
    print(f"  zip URL: {zip_url}")

    downloads = [{"id": "amexportcompta-dl", "name": DOWNLOAD_NAME, "file": zip_url}]

    print("Lecture de la fiche produit…")
    _, current = _request(
        "GET",
        f"{base.rstrip('/')}/wp-json/wc/v3/products/{PRODUCT_ID}",
        user,
        pwd,
    )
    description = normalize_product_description(current.get("description", ""))

    print("Mise à jour produit parent…")
    product = put_json(
        base,
        user,
        pwd,
        f"/wp-json/wc/v3/products/{PRODUCT_ID}",
        {
            "sku": SKU,
            "downloads": downloads,
            "description": description,
            "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": "20260805"},
                {"key": "version_du_module__theme", "value": f"V{VERSION}"},
                {"key": "versions", "value": PS_VERSIONS_LABEL},
                {"key": "changelog", "value": build_changelog()},
                {
                    "key": "infos_demo",
                    "value": (
                        "Modules → (AM) Export comptable : configurez comptes, colonnes, export manuel "
                        "ou planifié. Version 3.9.6 : filtrage par statuts sur l’export ABBY, portail Mes licences pour l’activation "
                        "par domaine, interface d’enregistrement en français."
                    ),
                },
            ],
        },
    )

    print("Mise à jour des variations…")
    for var in _request(
        "GET",
        f"{base.rstrip('/')}/wp-json/wc/v3/products/{PRODUCT_ID}/variations?per_page=20",
        user,
        pwd,
    )[1]:
        put_json(
            base,
            user,
            pwd,
            f"/wp-json/wc/v3/products/{PRODUCT_ID}/variations/{var['id']}",
            {
                "downloadable": True,
                "downloads": downloads,
            },
        )
        print(f"  variation {var['id']} OK")

    print("\n--- Terminé ---")
    print(f"Nom     : {product['name']}")
    print(f"SKU     : {product.get('sku')}")
    print(f"Version : {VERSION}")
    print(f"Admin   : {base}/wp-admin/post.php?post={PRODUCT_ID}&action=edit")
    print(f"Aperçu  : {base}/produit/module-export-comptable-pour-prestashop/")


if __name__ == "__main__":
    main()
