#!/usr/bin/env python3
"""Déploie AmLicenceClient + trait partagés dans les modules PrestaShop licenciés."""

from __future__ import annotations

import re
import shutil
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
CORE = ROOT / "scripts" / "amlicence_client_core.php"
TRAIT = ROOT / "scripts" / "amlicence_module_trait.php"

MODULES = [
    {
        "path": Path("/Users/arnaudmerigeau/Locals/bohomane_refonte/modules/amchoose"),
        "main": "amchoose.php",
        "wc_product_id": 15738,
        "prefix": "amchoose",
    },
    {
        "path": ROOT / "exports" / "pennylane-product" / "pennylane",
        "main": "pennylane.php",
        "wc_product_id": 16010,
        "prefix": "pennylane",
    },
    {
        "path": Path("/Users/arnaudmerigeau/Locals/bohomane_refonte/modules/amsavai"),
        "main": "amsavai.php",
        "wc_product_id": 15829,
        "prefix": "amsavai",
    },
    {
        "path": Path("/Users/arnaudmerigeau/Locals/bohomane_refonte/modules/amflags"),
        "main": "amflags.php",
        "wc_product_id": 15395,
        "prefix": "amflags",
    },
    {
        "path": Path("/Users/arnaudmerigeau/Locals/ixtemmoto/modules/amquestions"),
        "main": "amquestions.php",
        "wc_product_id": 15756,
        "prefix": "amquestions",
    },
    {
        "path": Path("/Users/arnaudmerigeau/Locals/bohomane_refonte/modules/ammultiplestrackings"),
        "main": "ammultiplestrackings.php",
        "wc_product_id": 15729,
        "prefix": "ammts",
    },
    {
        "path": Path("/Users/arnaudmerigeau/Locals/ps17/modules/amexportcompta"),
        "main": "amexportcompta.php",
        "wc_product_id": 7949,
        "prefix": "amae",
        "uses_trait": False,
    },
]

TPL = """{**
 * Enregistrement module — AmLicence Manager
 *}
<div class="panel pennylane-license-panel">
  <div class="panel-heading">
    <i class="icon-key"></i> {l s='Licence du module' mod=$module_name}
  </div>
  <div class="panel-body">
    {if $module_registered < 1}
      <div class="alert alert-warning">
        <i class="icon-warning"></i>
        {l s='Ce module nécessite une licence active pour fonctionner.' mod=$module_name}
      </div>
      <p>{l s='Pour activer ce module sur votre boutique, ouvrez votre espace client avec le bouton ci-dessous, saisissez le numéro et la date de votre commande, puis associez le domaine de la boutique. Rechargez ensuite cette page.' mod=$module_name}</p>
      <p class="help-block">
        {l s='Domaine de la boutique détecté :' mod=$module_name}
        <code>{$shop_domain|escape:'html':'UTF-8'}</code>
      </p>
      <a target="_blank" rel="noopener noreferrer" href="{$license_portal_url|escape:'html':'UTF-8'}" class="btn btn-primary btn-lg">
        <i class="icon-key"></i> {l s='Mes licences' mod=$module_name}
      </a>
    {else}
      <div class="alert alert-success">
        <i class="icon-check"></i>
        {l s='Licence active pour cette boutique.' mod=$module_name}
      </div>
      <p class="help-block">
        {l s='Domaine activé :' mod=$module_name}
        <code>{$shop_domain|escape:'html':'UTF-8'}</code>
      </p>
      <a target="_blank" rel="noopener noreferrer" href="{$license_portal_url|escape:'html':'UTF-8'}" class="btn btn-default">
        <i class="icon-key"></i> {l s='Gérer ma licence et mes domaines' mod=$module_name}
      </a>
    {/if}
  </div>
</div>
"""

METHODS_TEMPLATE = """
    protected function getAmLicenceWcProductId()
    {{
        return {wc_product_id};
    }}

    protected function getAmLicenceLicenseConfigKey()
    {{
        return '{prefix}_license_key';
    }}

    protected function getAmLicenceVerifyCacheConfigKey()
    {{
        return '{prefix}_license_verify_cache';
    }}
"""


def inject_config_methods(main_file: Path, module: dict) -> None:
    content = main_file.read_text(encoding="utf-8")
    marker = "use AmLicenceModuleTrait;"
    if marker not in content:
        raise ValueError(f"{main_file}: trait non trouvé")

    if "getAmLicenceWcProductId" in content:
        content = re.sub(
            r"\n    protected function getAmLicenceWcProductId\(\).*?protected function getAmLicenceVerifyCacheConfigKey\(\).*?\n    \}\n",
            METHODS_TEMPLATE.format(
                wc_product_id=module["wc_product_id"],
                prefix=module["prefix"],
            ),
            content,
            count=1,
            flags=re.DOTALL,
        )
    else:
        methods = METHODS_TEMPLATE.format(
            wc_product_id=module["wc_product_id"],
            prefix=module["prefix"],
        )
        content = content.replace(marker, marker + methods, 1)

    main_file.write_text(content, encoding="utf-8")


def write_files(module: dict) -> None:
    base = module["path"]
    classes_dir = base / "classes"
    tpl_dir = base / "views" / "templates" / "admin"
    classes_dir.mkdir(parents=True, exist_ok=True)
    tpl_dir.mkdir(parents=True, exist_ok=True)

    shutil.copy2(CORE, classes_dir / "AmLicenceClient.php")
    if module.get("uses_trait", True):
        shutil.copy2(TRAIT, classes_dir / "AmLicenceModuleTrait.php")
        (tpl_dir / "license_registration.tpl").write_text(TPL, encoding="utf-8")
        inject_config_methods(base / module["main"], module)
    print(f"  OK {base.name}")


def main() -> None:
    only = sys.argv[1] if len(sys.argv) > 1 else None
    updated = 0
    for module in MODULES:
        if only and module["path"].name != only and module.get("prefix") != only:
            continue
        if not module["path"].is_dir():
            raise FileNotFoundError(module["path"])
        write_files(module)
        updated += 1
    print(f"{updated} modules PrestaShop mis à jour (AmLicenceClient partagé).")


if __name__ == "__main__":
    main()
