#!/usr/bin/env python3
"""Génère posts.json du kit social « Contrat de maintenance PrestaShop 2026 »."""

from __future__ import annotations

import json
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
KIT = ROOT / "www/propositions/kit-social-maintenance-prestashop-2026"
ARTICLE = "https://www.arnaud-merigeau.fr/contrat-maintenance-prestashop-2026/"
CONTACT = "https://www.arnaud-merigeau.fr/contact/"
CAMPAIGN = "maintenance-prestashop-2026"


def link(network: str, content: str) -> str:
    src = "twitter" if network == "x" else network
    return f"{ARTICLE}?utm_source={src}&utm_medium=social&utm_campaign={CAMPAIGN}&utm_content={content}"


# --------------------------------------------------------------- post 1 : la sauvegarde
P1_LINKEDIN = f"""« Sauvegarde quotidienne ». C'est écrit dans ton contrat de maintenance.

Question suivante : la dernière fois que quelqu'un l'a restaurée pour de vrai, c'était quand ?

Là, en général, il y a un silence.

C'est la ligne qui manque dans la quasi-totalité des contrats PrestaShop que je relis. La sauvegarde est planifiée, la case est cochée, tout le monde dort tranquille. Et le jour où il faut restaurer, on découvre que le dump de la base est tronqué depuis huit mois, ou qu'il vit sur le même serveur que le site qu'on vient de perdre.

Une sauvegarde jamais restaurée n'est pas une garantie. C'est une hypothèse.

Ce que je fais écrire dans un contrat, et que tu peux exiger de n'importe qui :

→ copie stockée hors du serveur principal, chez un autre fournisseur si possible
→ rétention de 30 jours minimum, parce qu'une compromission se découvre rarement le jour même
→ délai de restauration chiffré, mesuré, pas estimé
→ test de restauration réel tous les trimestres, avec compte rendu
→ sauvegarde inaccessible depuis le serveur du site : si l'attaquant qui prend ta boutique peut aussi effacer tes backups, tu n'as pas de backups

Cinq lignes. Elles coûtent zéro euro à ajouter au contrat, et elles changent tout le jour de l'incident.

J'ai écrit le guide complet : ce que doit contenir un contrat de maintenance PrestaShop ligne par ligne, les tarifs réels du marché en 2026, les 9 clauses qui coûtent cher, et 12 questions à envoyer telles quelles à ton prestataire actuel.

{link("linkedin", "linkedin-p1")}

#PrestaShop #Ecommerce #Maintenance #Sauvegarde"""

P1_X = f"""Ton contrat de maintenance PrestaShop dit « sauvegarde quotidienne ».

La vraie question : quand a-t-elle été restaurée pour de vrai ?

Une sauvegarde jamais testée est une hypothèse, pas une garantie.

Guide complet 👇
{link("x", "x-p1")}"""

P1_FACEBOOK = f"""« Sauvegarde quotidienne » figure dans votre contrat de maintenance.

Question suivante : quand a-t-elle été restaurée pour de vrai, sur un environnement de test ?

C'est la ligne qui manque dans presque tous les contrats PrestaShop que je relis. La sauvegarde tourne, tout le monde est rassuré, et le jour de l'incident on découvre que la base est tronquée depuis des mois.

Dans le guide que je viens de publier : ce qu'un contrat de maintenance doit contenir ligne par ligne, les tarifs réels 2026 (de 50 à 600 € par mois selon le niveau), les 9 clauses qui piègent, et 12 questions à poser à votre prestataire actuel.

👉 {link("facebook", "facebook-p1")}"""


# --------------------------------------------------------------- post 2 : le coût
P2_LINKEDIN = f"""Une boutique PrestaShop ne tombe jamais en panne le mardi à 10 h.

Elle tombe le vendredi à 18 h 40, pendant une opération commerciale, quand le module de paiement refuse toutes les cartes et que la seule personne qui connaît le serveur est en vacances.

À ce moment précis, ce qui décide de la suite n'est ni ton hébergeur ni ta chance. C'est ce que tu as signé, ou pas signé, six mois plus tôt.

Le calcul que peu de marchands font :

Une boutique à 300 000 € de CA annuel génère en moyenne 822 € par jour. Trois jours d'arrêt, et tu as dépensé l'équivalent d'un an de contrat de maintenance standard. Sans compter les paniers qui ne reviennent pas, et les campagnes payantes qui tournent dans le vide pendant l'incident.

À 1 M€ de CA, la journée d'arrêt coûte 2 740 €.

Et ce calcul est optimiste : il divise par 365 comme si toutes les journées se valaient. Un arrêt le 25 novembre coûte plusieurs fois la moyenne.

Pendant ce temps, sur la seule branche 8.2, PrestaShop a corrigé cette année un XSS stocké noté 9,3 sur 10 dans la vue Service client, une injection de formule dans les exports CSV à 8,3, et une SSRF à 8,2. Les correctifs existent, publiés, documentés.

La question n'a jamais été de savoir si PrestaShop fait son travail. Il le fait. La question, c'est qui applique le patch chez toi, et sous quel délai.

Sans contrat, la réponse est presque toujours « personne, on verra ce week-end ». Et ce week-end n'arrive jamais.

Le guide complet, avec les tarifs réels du marché 2026 :
{link("linkedin", "linkedin-p2")}

#PrestaShop #Ecommerce #Securite #Maintenance"""

P2_X = f"""Une boutique PrestaShop ne tombe jamais en panne le mardi matin.

Elle tombe le vendredi à 18h40, en pleine opé commerciale.

300 k€ de CA = 822 € perdus par jour d'arrêt.
3 jours = le prix d'un an de contrat.

{link("x", "x-p2")}"""

P2_FACEBOOK = f"""Combien coûte une journée de boutique à l'arrêt ?

À 100 000 € de chiffre d'affaires annuel : 274 €.
À 300 000 € : 822 €.
À 1 M€ : 2 740 €.

Trois jours d'arrêt sur une boutique à 300 000 €, et vous avez dépensé l'équivalent d'un an de contrat de maintenance. Sans compter les paniers perdus et les campagnes qui tournent dans le vide.

Sur la seule branche 8.2, PrestaShop a corrigé cette année plusieurs failles dont un XSS stocké noté 9,3 sur 10. Les correctifs existent. La vraie question, c'est qui les applique chez vous, et sous quel délai.

👉 Le guide complet, avec les tarifs 2026 : {link("facebook", "facebook-p2")}"""


# --------------------------------------------------------------- post 3 : les questions
P3_LINKEDIN = f"""Tu paies une maintenance PrestaShop tous les mois. Tu sais ce que tu achètes ?

Test rapide. Copie ces six questions, envoie-les à ton prestataire, et regarde le temps qu'il met à répondre.

1. Quelle version de PrestaShop tourne actuellement, et quel est le dernier correctif de sécurité appliqué ?
2. Mes sauvegardes sont stockées où, avec quelle rétention, et quand as-tu restauré pour de vrai la dernière fois ?
3. Que surveille exactement le monitoring, et qui reçoit l'alerte à 22 h ?
4. Où sont testées les mises à jour avant la production ?
5. Combien d'heures ai-je consommées ces six derniers mois ?
6. Si j'arrête demain, sous quel délai je récupère accès, sauvegardes et documentation ?

Un prestataire sérieux répond aux six en une heure, sans chercher.

S'il faut trois relances pour obtenir des réponses vagues, tu viens d'apprendre quelque chose d'utile : c'est exactement le comportement que tu auras le jour de l'incident.

Deux réponses qui doivent t'alerter tout de suite. « Les sauvegardes sont chez l'hébergeur » : elles vivent donc sur l'infrastructure que tu es en train de perdre. Et « on met à jour directement en ligne, la nuit » : ce n'est pas une mise à jour, c'est un pari.

Les six autres questions, dont celle sur la propriété du code et celle sur le titulaire de ton nom de domaine (vérifie, la surprise est fréquente), sont dans le guide.

Avec les tarifs réels du marché, les 14 lignes qu'un contrat doit contenir, et les 9 clauses qui coûtent cher.

{link("linkedin", "linkedin-p3")}

#PrestaShop #Ecommerce #Freelance #Maintenance"""

P3_X = f"""3 questions pour ton prestataire de maintenance PrestaShop :

1. Dernier correctif de sécurité appliqué ?
2. Quand as-tu restauré une sauvegarde ?
3. Si j'arrête demain, je récupère quoi, et quand ?

Les 9 autres 👇
{link("x", "x-p3")}"""

P3_FACEBOOK = f"""Vous payez une maintenance PrestaShop tous les mois. Savez-vous ce que vous achetez ?

Quatre questions à envoyer à votre prestataire aujourd'hui :

• Quel est le dernier correctif de sécurité appliqué sur ma boutique ?
• Mes sauvegardes sont stockées où, et quand ont-elles été restaurées pour de vrai ?
• Où sont testées les mises à jour avant la production ?
• Si j'arrête demain, sous quel délai je récupère mes accès et mes sauvegardes ?

Un prestataire sérieux répond aux quatre en une heure. S'il faut trois relances, vous savez déjà comment ça se passera le jour de la panne.

Les 12 questions complètes, les tarifs 2026 et les clauses à surveiller sont dans le guide.

👉 {link("facebook", "facebook-p3")}"""


DATA = {
    "meta": {
        "title": "Kit social — Contrat de maintenance PrestaShop 2026",
        "slug": "kit-social-maintenance-prestashop-2026",
        "status": "ready",
        "period": "3 posts à étaler sur 10 jours",
        "cadence": "J+1, J+4, J+8 après publication de l'article",
        "utm_campaign": CAMPAIGN,
        "description": (
            "Promotion de l'article pilier sur le contrat de maintenance PrestaShop. "
            "Cible les requêtes maintenance prestashop et contrat de maintenance prestashop, "
            "avec un objectif de prise de contact pour des prestations de TMA."
        ),
        "contact_url": CONTACT,
    },
    "footer": {
        "linkedin": (
            "👋 Je suis Arnaud Mérigeau, freelance PrestaShop & WordPress certifié Experts "
            "(+15 ans). Je passe l'essentiel de mon temps sur des boutiques que je n'ai pas "
            "construites moi-même : maintenance, sécurité, migrations.\n"
            f"→ Me contacter : {CONTACT}"
        ),
        "x": "👋 Freelance PrestaShop / WordPress certifié Experts · www.arnaud-merigeau.fr/contact/",
        "facebook": (
            "👋 Arnaud Mérigeau · freelance PrestaShop certifié Experts (+15 ans)\n"
            f"→ Me contacter : {CONTACT}"
        ),
    },
    "posts": [
        {
            "id": "maintenance-ps-sauvegarde",
            "date": "2026-09-08",
            "day": "À publier",
            "time": "08h30",
            "type": "Article / expertise",
            "title": "La sauvegarde jamais restaurée",
            "url": ARTICLE,
            "url_slug": "maintenance-ps-sauvegarde",
            "hashtags": ["#PrestaShop", "#Ecommerce", "#Maintenance", "#Sauvegarde"],
            "category": "Sécurité",
            "resource_label": "Lire le guide",
            "objective": (
                "Accrocher les marchands qui ont déjà un contrat. Angle contre-intuitif : "
                "la sauvegarde planifiée ne vaut rien sans test de restauration."
            ),
            "note": (
                "Post d'ouverture, le plus fort en engagement attendu (question directe au "
                "lecteur). Visuel 1920×1080. Publier un lundi ou mardi matin."
            ),
            "linkedin": P1_LINKEDIN,
            "x": P1_X,
            "facebook": P1_FACEBOOK,
            "visual": {
                "file": "visuels/visuel-maintenance-prestashop-2026.jpg",
                "alt": "Ce que ton contrat de maintenance PrestaShop ne dit pas — arnaud-merigeau.fr",
                "format": "1920×1080 JPG 16:9 — LinkedIn, X et Facebook",
            },
        },
        {
            "id": "maintenance-ps-cout-panne",
            "date": "2026-09-11",
            "day": "À publier",
            "time": "12h15",
            "type": "Chiffres / storytelling",
            "title": "Le vendredi 18 h 40",
            "url": ARTICLE,
            "url_slug": "maintenance-ps-cout-panne",
            "hashtags": ["#PrestaShop", "#Ecommerce", "#Securite", "#Maintenance"],
            "category": "E-commerce",
            "resource_label": "Voir les tarifs 2026",
            "objective": (
                "Chiffrer le risque pour déclencher la décision budgétaire. "
                "Coût d'une journée d'arrêt + CVE PrestaShop réelles de 2026."
            ),
            "note": (
                "Chiffres vérifiables : CA annuel ÷ 365, et scores CVSS publiés par "
                "build.prestashop-project.org. Visuel coût de la panne."
            ),
            "linkedin": P2_LINKEDIN,
            "x": P2_X,
            "facebook": P2_FACEBOOK,
            "visual": {
                "file": "visuels/maintenance-prestashop-2026-cout-panne.png",
                "alt": "Coût d'une journée d'arrêt d'une boutique PrestaShop selon le chiffre d'affaires",
                "format": "1280×720 PNG 16:9 — LinkedIn, X et Facebook",
            },
        },
        {
            "id": "maintenance-ps-12-questions",
            "date": "2026-09-15",
            "day": "À publier",
            "time": "08h30",
            "type": "Checklist / utilité directe",
            "title": "Les questions à poser à ton prestataire",
            "url": ARTICLE,
            "url_slug": "maintenance-ps-12-questions",
            "hashtags": ["#PrestaShop", "#Ecommerce", "#Freelance", "#Maintenance"],
            "category": "PrestaShop",
            "resource_label": "Les 12 questions",
            "objective": (
                "Donner de la valeur immédiate et récupérer les marchands mal servis "
                "par leur prestataire actuel. Fort potentiel de partage et de commentaires."
            ),
            "note": (
                "Le post le plus susceptible de générer des messages privés. Prévoir du "
                "temps pour répondre en commentaire le jour de la publication."
            ),
            "linkedin": P3_LINKEDIN,
            "x": P3_X,
            "facebook": P3_FACEBOOK,
            "visual": {
                "file": "visuels/maintenance-prestashop-2026-cycle.png",
                "alt": "Cycle quotidien, mensuel, trimestriel et annuel d'un contrat de maintenance PrestaShop",
                "format": "1280×700 PNG — LinkedIn, X et Facebook",
            },
        },
    ],
}


def main() -> int:
    KIT.mkdir(parents=True, exist_ok=True)
    out = KIT / "posts.json"
    out.write_text(json.dumps(DATA, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
    lengths = {p["id"]: len(p["linkedin"]) for p in DATA["posts"]}
    print(f"Écrit : {out}")
    for pid, n in lengths.items():
        print(f"  {pid} — LinkedIn {n} caractères")
    return 0


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