#!/usr/bin/env python3
"""Crée la fiche produit WooCommerce brouillon pour le plugin WordPress am-seo-links."""

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

ASSETS = ROOT / "exports" / "am-seo-links-product"
ZIP_PATH = ASSETS / "am-seo-links-2.0.0.zip"

PRODUCT_NAME = "Plugin WordPress liens automatiques SEO et maillage interne"
SLUG = "plugin-wordpress-liens-automatiques-seo-maillage-interne"
SKU = "am-seo-links-2.0.0"

SHORT_DESCRIPTION = (
    "Automatisez le maillage interne WordPress : règles par expressions clés, liens internes "
    "ou externes, priorités, statistiques, import/export et prévisualisation depuis l'éditeur."
)

DESCRIPTION_HTML = """<h2>Un maillage interne intelligent, piloté par des règles</h2>
<p>Le référencement de votre site WordPress repose en grande partie sur la structure de vos liens internes. Ce plugin transforme automatiquement des <strong>expressions clés</strong> en liens contextuels vers vos contenus pertinents — sans retoucher manuellement chaque article.</p>
<p>Définissez vos règles une fois, le plugin les applique au fil du contenu publié (articles, pages, types de contenus activés, champs ACF optionnels).</p>

<h2>Règles avancées de linking</h2>
<ul>
<li>liens <strong>internes</strong> (recherche par mots-clés, article cible ou URL fixe) ou <strong>externes</strong>,</li>
<li>expressions principales et alternatives, variations d'ancre,</li>
<li>priorité des règles, limites de frontières de mots,</li>
<li>filtres par catégories sources et mots-clés requis dans le contenu,</li>
<li>options nofollow, rel personnalisé, listes blanche/noire de domaines externes,</li>
<li>plafonds globaux de liens internes et externes par contenu.</li>
</ul>

<h2>Interface d'administration complète</h2>
<p>Menu dédié <strong>Liens automatiques SEO</strong> avec :</p>
<ul>
<li><strong>Règles</strong> — création, édition, activation/désactivation en AJAX,</li>
<li><strong>Paramètres</strong> — types de contenus, cache, logs, champs ACF, seuils de sur-optimisation,</li>
<li><strong>Statistiques</strong> — liens appliqués, ancres les plus utilisées, alertes sur-optimisation,</li>
<li><strong>Import / Export</strong> — sauvegarde et migration des règles en JSON.</li>
</ul>

<h2>Prévisualisation depuis l'éditeur</h2>
<p>Meta box sur chaque contenu éligible : désactivation ponctuelle du plugin sur un article, bouton de prévisualisation des liens qui seraient injectés avant publication.</p>

<h2>Performance et traçabilité</h2>
<ul>
<li>cache des contenus traités (invalidation automatique à la sauvegarde),</li>
<li>journal des applications de liens (ancre, URL cible, règle),</li>
<li>respect des balises HTML exclues (titres, liens existants, shortcodes…),</li>
<li>une seule occurrence par expression et par URL dans un même contenu.</li>
</ul>

<h2>Cas d'usage</h2>
<ul>
<li>blogs et magazines avec des centaines d'articles à mailler,</li>
<li>sites e-commerce éditoriaux (guides, catégories, comparatifs),</li>
<li>sites corporate avec contenus SEO thématiques,</li>
<li>agences gérant le maillage interne de plusieurs sites clients.</li>
</ul>

<h2>Compatibilité et installation</h2>
<ul>
<li>WordPress <strong>5.0+</strong>, PHP <strong>7.4+</strong>,</li>
<li>compatible Gutenberg et éditeur classique,</li>
<li>tables dédiées créées à l'activation,</li>
<li>installation plug &amp; play dans <code>wp-content/plugins/</code>.</li>
</ul>

<h2>Conclusion</h2>
<p>Ce plugin WordPress de liens automatiques SEO industrialise votre maillage interne : règles flexibles, statistiques, import/export et contrôle fin depuis le back-office. Idéal pour gagner du temps tout en structurant votre SEO on-page.</p>
<p>Livraison immédiate du ZIP après achat, avec licence et mises à jour selon la durée choisie.</p>"""

YOAST_TITLE = "Plugin WordPress liens automatiques SEO - Maillage interne intelligent"
YOAST_METADESC = (
    "Plugin WordPress pour automatiser le maillage interne : règles par expressions, liens internes/externes, "
    "statistiques, import-export JSON, prévisualisation éditeur. WordPress 5+."
)
YOAST_FOCUS = "Plugin WordPress maillage interne SEO"

VARIATIONS = [
    ("6 mois", "49.97"),
    ("12 mois (25% d'économie)", "87.4475"),
    ("24 mois (54% d'économie)", "97.9412"),
]

IMAGE_FILES = [
    ("product-am-seo-links-featured.png", "Plugin WordPress liens automatiques SEO et maillage interne", True),
    ("product-am-seo-links-admin.png", "Back-office WordPress - règles de maillage interne automatique", False),
    ("product-am-seo-links-stats.png", "Statistiques et journal des liens SEO appliqués", False),
    ("product-am-seo-links-module.png", "Plugin WordPress am-seo-links - icône", False),
]

DOWNLOAD_NAME = "plugin-liens-automatiques-seo-wordpress-2.0.0"


def post_json(base_url: str, user: str, password: str, path: str, payload: dict) -> dict:
    url = f"{base_url.rstrip('/')}{path}"
    _, data = _request(
        "POST",
        url,
        user,
        password,
        data=json.dumps(payload).encode("utf-8"),
        headers={"Content-Type": "application/json"},
    )
    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 main() -> None:
    cfg = load_config()
    base = cfg.wp_base_url
    user = cfg.wp_user
    pwd = cfg.wp_application_password.replace(" ", "")

    print("Upload des images…")
    image_ids: list[int] = []
    featured_id: int | None = None
    for filename, alt, is_featured in IMAGE_FILES:
        path = ASSETS / filename
        media = upload_media(base, user, pwd, path, alt_text=alt, title=alt)
        mid = int(media["id"])
        image_ids.append(mid)
        if is_featured:
            featured_id = mid
        print(f"  media {mid}: {filename}")

    print("Upload du ZIP…")
    zip_media = upload_media(
        base,
        user,
        pwd,
        ZIP_PATH,
        alt_text="Plugin WordPress liens automatiques SEO v2.0.0",
        title=DOWNLOAD_NAME,
    )
    zip_url = zip_media.get("source_url") or zip_media.get("guid", {}).get("rendered", "")
    print(f"  zip URL: {zip_url}")

    print("Création du produit variable (brouillon)…")
    product_payload = {
        "name": PRODUCT_NAME,
        "slug": SLUG,
        "type": "variable",
        "status": "draft",
        "catalog_visibility": "visible",
        "description": DESCRIPTION_HTML,
        "short_description": SHORT_DESCRIPTION,
        "sku": SKU,
        "virtual": True,
        "downloadable": True,
        "downloads": [
            {
                "id": str(uuid.uuid4()),
                "name": DOWNLOAD_NAME,
                "file": zip_url,
            }
        ],
        "download_limit": -1,
        "download_expiry": -1,
        "tax_status": "taxable",
        "manage_stock": False,
        "categories": [{"id": 952}],
        "tags": [
            {"name": "wordpress"},
            {"name": "plugin wordpress"},
            {"name": "SEO"},
            {"name": "maillage interne"},
            {"name": "liens automatiques"},
        ],
        "images": [{"id": i} for i in image_ids],
        "attributes": [
            {
                "id": 2,
                "position": 0,
                "visible": True,
                "variation": True,
                "options": [v[0] for v in VARIATIONS],
            },
            {
                "id": 3,
                "position": 1,
                "visible": False,
                "variation": False,
                "options": ["Conversions"],
            },
        ],
        "default_attributes": [
            {"id": 2, "name": "Durée du SAV et des mises à jour", "option": "6 mois"},
        ],
        "meta_data": [
            {"key": "_yoast_wpseo_title", "value": YOAST_TITLE},
            {"key": "_yoast_wpseo_metadesc", "value": YOAST_METADESC},
            {"key": "_yoast_wpseo_focuskw", "value": YOAST_FOCUS},
            {"key": "_yoast_wpseo_primary_product_cat", "value": "952"},
            {"key": "_amlicence_lm_enabled", "value": "yes"},
            {"key": "_amlicence_lm_activation_slots", "value": "1"},
            {"key": "_amlicence_lm_expiry_months", "value": "0"},
        ],
    }

    product = post_json(base, user, pwd, "/wp-json/wc/v3/products", product_payload)
    product_id = int(product["id"])
    print(f"Produit créé: id={product_id}")

    print("Création des variations…")
    for option, price in VARIATIONS:
        var_payload = {
            "regular_price": price,
            "virtual": True,
            "downloadable": True,
            "downloads": product_payload["downloads"],
            "attributes": [
                {
                    "id": 2,
                    "name": "Durée du SAV et des mises à jour",
                    "option": option,
                }
            ],
            "meta_data": [
                {"key": "_amlicence_lm_enabled", "value": "yes"},
                {"key": "_amlicence_lm_activation_slots", "value": "1"},
                {"key": "_amlicence_lm_expiry_months", "value": "0"},
            ],
        }
        var = post_json(
            base,
            user,
            pwd,
            f"/wp-json/wc/v3/products/{product_id}/variations",
            var_payload,
        )
        print(f"  variation {var['id']}: {option} → {price} €")

    print("Mise à jour ACF (meta WooCommerce) et image à la une…")
    changelog = (
        "<h3>Version 2.0.0</h3><ul>"
        "<li>Règles de maillage interne/externe par expressions et priorités</li>"
        "<li>Statistiques, logs et détection de sur-optimisation</li>"
        "<li>Import / export JSON des règles</li>"
        "<li>Prévisualisation depuis la meta box éditeur</li>"
        "<li>Support champs ACF et cache de contenu</li></ul>"
    )
    put_json(
        base,
        user,
        pwd,
        f"/wp-json/wc/v3/products/{product_id}",
        {
            "meta_data": [
                {"key": "cms", "value": ["WordPress"]},
                {"key": "versions", "value": "WordPress 5.0+ / PHP 7.4+"},
                {"key": "langues_du_module", "value": ["FR"]},
                {"key": "derniere_mise_a_jour", "value": "20250527"},
                {"key": "version_du_module__theme", "value": "V2.0.0"},
                {"key": "niveau", "value": "Simple d'utilisation"},
                {"key": "documentation", "value": "1"},
                {"key": "changelog", "value": changelog},
                {
                    "key": "infos_demo",
                    "value": (
                        "Plugin disponible sur ce site. Menu admin : Liens automatiques SEO. "
                        "Installez le ZIP dans wp-content/plugins/ puis activez-le."
                    ),
                },
            ]
        },
    )
    try:
        put_json(
            base,
            user,
            pwd,
            f"/wp-json/wp/v2/product/{product_id}",
            {"excerpt": SHORT_DESCRIPTION, "featured_media": featured_id},
        )
        print("  excerpt + featured_media OK")
    except RuntimeError as e:
        print(f"  Avertissement WP: {e}")

    edit_url = f"{base}/wp-admin/post.php?post={product_id}&action=edit"
    print("\n--- Terminé ---")
    print(f"ID produit : {product_id}")
    print(f"Slug       : {SLUG}")
    print(f"Édition BO : {edit_url}")
    print(f"Aperçu     : {base}/produit/{SLUG}/?preview=true")


if __name__ == "__main__":
    main()
