// Pages légales du site vitrine : mentions légales (LCEN art. 6-III et 19),
// politique de confidentialité (RGPD art. 13), cookies (art. 82 LIL). Routées
// par app.jsx sur "#/mentions-legales", "#/confidentialite", "#/cookies".
// Identité : COMPANY.md (source unique) - à reporter ici si elle change.
const COMPANY = {
  name: "SHOPTIMIZE SAS",
  form: { fr: "société par actions simplifiée", en: "French simplified joint-stock company (SAS)" },
  capital: "1 000 €",
  address: "43 rue Jacques Prévert, 59650 Villeneuve-d'Ascq, France",
  siren: "993 799 741",
  rcs: { fr: "RCS de Lille Métropole", en: "Lille Métropole Trade and Companies Register (RCS)" },
  vat: "FR57 993 799 741",
  director: "Lyes Chikhi",
  email: "contact@shoptimize.global",
  phone: "+33 6 51 57 37 51",
  phoneHref: "tel:+33651573751",
  host: { name: "Vercel Inc.", address: "440 N Barranca Ave #4133, Covina, CA 91723, États-Unis", site: "vercel.com" },
  updated: { fr: "26 août 2026", en: "26 August 2026" },
};

const LEGAL_COPY = {
  fr: {
    back: "Retour",
    updated: "Dernière mise à jour",
    pages: {
      "mentions-legales": {
        title: "Mentions légales",
        subtitle: "Loi n° 2004-575 du 21 juin 2004 (LCEN)",
        sections: [
          { title: "Éditeur", items: [
            [`${COMPANY.name}, ${COMPANY.form.fr} au capital de ${COMPANY.capital}`],
            [`Siège social : ${COMPANY.address}`],
            [`Immatriculée au ${COMPANY.rcs.fr} et au RNE sous le n° ${COMPANY.siren}`],
            [`N° de TVA intracommunautaire : ${COMPANY.vat}`],
            ["E-mail : ", { email: true }, " - Téléphone : ", { phone: true }],
          ] },
          { title: "Directeur de la publication", items: [[`${COMPANY.director}, président de ${COMPANY.name}`]] },
          { title: "Hébergeur", items: [[`${COMPANY.host.name} - ${COMPANY.host.address}`], [{ link: `https://${COMPANY.host.site}`, label: COMPANY.host.site }]] },
        ],
      },
      confidentialite: {
        title: "Politique de confidentialité",
        subtitle: "Règlement (UE) 2016/679 (RGPD) et loi Informatique et Libertés",
        sections: [
          { title: "Responsable du traitement", items: [
            [`${COMPANY.name}, ${COMPANY.address}. Pour toute question sur vos données : `, { email: true }, " ou ", { phone: true }, "."],
          ] },
          { title: "Quelles données, pour quoi, combien de temps ?", table: {
            head: ["Données", "Finalité", "Base légale", "Conservation"],
            rows: [
              ["Formulaire de contact et e-mails : nom, adresse e-mail, pays, message", "Répondre à votre demande, échanges commerciaux", "Mesures précontractuelles / intérêt légitime", "3 ans après le dernier échange"],
              ["Journaux techniques de l'hébergeur : adresse IP, navigateur, pages consultées", "Sécurité et bon fonctionnement du site", "Intérêt légitime", "30 jours maximum"],
            ],
          }, items: [
            ["Aucune donnée n'est utilisée à des fins publicitaires, ni vendue, ni cédée. Aucun profilage, aucune décision automatisée."],
            ["Les données que nos clients nous confient pour leurs prestations logistiques sont traitées dans notre outil Tempo et relèvent de sa propre politique de confidentialité : ", { link: "https://tempo.shoptimize.global/confidentialite", label: "tempo.shoptimize.global/confidentialite" }, "."],
          ] },
          { title: "Qui a accès aux données ?", items: [
            [`Le personnel habilité de ${COMPANY.name} et nos prestataires techniques, liés par un contrat de sous-traitance conforme à l'article 28 du RGPD :`],
          ], table: {
            head: ["Prestataire", "Rôle", "Localisation"],
            rows: [
              ["Vercel Inc.", "Hébergement du site, journaux techniques", "Serveurs en Europe - société établie aux États-Unis"],
              ["Zoho Corporation", "Messagerie (e-mails que vous nous adressez)", "Centres de données dans l'Union européenne"],
            ],
          } },
          { title: "Transferts hors de l'Union européenne", items: [
            ["Le site est hébergé en Europe. Son hébergeur est une société américaine dont les équipes techniques peuvent accéder aux données pour la maintenance ; ces accès sont couverts par les garanties standard prévues par le RGPD (clauses contractuelles types), publiées dans son accord de traitement des données : ", { link: "https://vercel.com/legal/dpa", label: "Vercel" }, "."],
            ["Le chargement des pages fait appel à deux services tiers, qui reçoivent votre adresse IP : Google Fonts (polices de caractères, Google LLC, États-Unis) et unpkg (bibliothèques techniques, Cloudflare Inc., États-Unis). Aucun cookie n'est déposé par ces services."],
          ] },
          { title: "Vos droits", items: [
            ["Vous disposez d'un droit d'accès, de rectification, d'effacement, de limitation, d'opposition et de portabilité de vos données. Pour l'exercer, écrivez à ", { email: true }, " ; nous répondons dans un délai d'un mois. Vous pouvez également introduire une réclamation auprès de la CNIL (", { link: "https://www.cnil.fr", label: "cnil.fr" }, ")."],
          ] },
          { title: "Sécurité", items: [
            ["Échanges chiffrés (HTTPS), accès limités aux personnes habilitées. En cas de fuite de données présentant un risque pour vous, nous prévenons la CNIL sous 72 heures et, si nécessaire, les personnes concernées, comme la loi l'impose."],
          ] },
          { title: "Cookies", items: [
            ["Ce site n'utilise aucun cookie. Le détail figure sur la page ", { route: "cookies", label: "Cookies" }, "."],
          ] },
        ],
      },
      cookies: {
        title: "Cookies et traceurs",
        subtitle: "Article 82 de la loi Informatique et Libertés - lignes directrices de la CNIL",
        sections: [
          { title: "En résumé", items: [
            ["Ce site ne dépose aucun cookie : ni cookie publicitaire, ni mesure d'audience, ni bouton de réseau social, ni traceur tiers. C'est pourquoi aucun bandeau de consentement ne vous est présenté."],
          ] },
          { title: "Ce qui est utilisé", table: {
            head: ["Élément", "Type", "Finalité", "Durée"],
            rows: [
              ["Google Fonts", "Requête vers un service tiers (pas de cookie)", "Affichage des polices de caractères", "Le temps du chargement"],
              ["unpkg", "Requête vers un service tiers (pas de cookie)", "Chargement des bibliothèques techniques du site", "Le temps du chargement"],
              ["Stockage local du navigateur", "Préférence d'affichage", "Mémoriser un réglage d'affichage du site", "Jusqu'à effacement des données du navigateur"],
            ],
          } },
          { title: "Vos choix", items: [
            ["Vous pouvez effacer le stockage local à tout moment depuis les réglages de votre navigateur, sans effet sur la consultation du site."],
            ["Le traitement de vos données est décrit dans la ", { route: "confidentialite", label: "politique de confidentialité" }, "."],
          ] },
        ],
      },
    },
  },
  en: {
    back: "Back",
    updated: "Last updated",
    pages: {
      "mentions-legales": {
        title: "Legal notice",
        subtitle: "French Act no. 2004-575 of 21 June 2004 (LCEN)",
        sections: [
          { title: "Publisher", items: [
            [`${COMPANY.name}, ${COMPANY.form.en} with a share capital of ${COMPANY.capital}`],
            [`Registered office: ${COMPANY.address}`],
            [`Registered with the ${COMPANY.rcs.en} and the national business register (RNE) under no. ${COMPANY.siren}`],
            [`EU VAT number: ${COMPANY.vat}`],
            ["E-mail: ", { email: true }, " - Phone: ", { phone: true }],
          ] },
          { title: "Publishing director", items: [[`${COMPANY.director}, President of ${COMPANY.name}`]] },
          { title: "Hosting provider", items: [[`${COMPANY.host.name} - ${COMPANY.host.address}`], [{ link: `https://${COMPANY.host.site}`, label: COMPANY.host.site }]] },
        ],
      },
      confidentialite: {
        title: "Privacy policy",
        subtitle: "Regulation (EU) 2016/679 (GDPR) and the French Data Protection Act",
        sections: [
          { title: "Data controller", items: [
            [`${COMPANY.name}, ${COMPANY.address}. For any question about your data: `, { email: true }, " or ", { phone: true }, "."],
          ] },
          { title: "What data, why, and for how long?", table: {
            head: ["Data", "Purpose", "Legal basis", "Retention"],
            rows: [
              ["Contact form and e-mails: name, e-mail address, country, message", "Answering your request, business exchanges", "Pre-contractual steps / legitimate interest", "3 years after the last exchange"],
              ["Hosting provider's technical logs: IP address, browser, pages viewed", "Security and proper operation of the site", "Legitimate interest", "30 days maximum"],
            ],
          }, items: [
            ["No data is used for advertising, sold or shared. No profiling, no automated decision-making."],
            ["Data entrusted to us by our clients for their logistics services is processed in our Tempo tool and governed by its own privacy policy: ", { link: "https://tempo.shoptimize.global/confidentialite", label: "tempo.shoptimize.global/confidentialite" }, "."],
          ] },
          { title: "Who has access to the data?", items: [
            [`Authorised staff of ${COMPANY.name} and our technical providers, bound by a data processing agreement compliant with Article 28 GDPR:`],
          ], table: {
            head: ["Provider", "Role", "Location"],
            rows: [
              ["Vercel Inc.", "Website hosting, technical logs", "Servers in Europe - company established in the United States"],
              ["Zoho Corporation", "E-mail service (messages you send us)", "Data centres in the European Union"],
            ],
          } },
          { title: "Transfers outside the European Union", items: [
            ["The site is hosted in Europe. Its hosting provider is a US company whose technical teams may access data for maintenance; such access is covered by the standard safeguards provided for by the GDPR (standard contractual clauses), published in its data processing agreement: ", { link: "https://vercel.com/legal/dpa", label: "Vercel" }, "."],
            ["Loading the pages calls two third-party services that receive your IP address: Google Fonts (typefaces, Google LLC, United States) and unpkg (technical libraries, Cloudflare Inc., United States). Neither sets any cookie."],
          ] },
          { title: "Your rights", items: [
            ["You have the right to access, rectify, erase, restrict, object to and port your data. To exercise it, write to ", { email: true }, "; we reply within one month. You may also lodge a complaint with the French supervisory authority, the CNIL (", { link: "https://www.cnil.fr", label: "cnil.fr" }, ")."],
          ] },
          { title: "Security", items: [
            ["Encrypted exchanges (HTTPS), access restricted to authorised persons. In the event of a data breach posing a risk to you, we notify the CNIL within 72 hours and, where required, the persons concerned, as the law requires."],
          ] },
          { title: "Cookies", items: [
            ["This site uses no cookies. Details are on the ", { route: "cookies", label: "Cookies" }, " page."],
          ] },
        ],
      },
      cookies: {
        title: "Cookies and trackers",
        subtitle: "Article 82 of the French Data Protection Act - CNIL guidelines",
        sections: [
          { title: "In short", items: [
            ["This site sets no cookies: no advertising cookie, no audience measurement, no social-network button, no third-party tracker. That is why no consent banner is shown."],
          ] },
          { title: "What is used", table: {
            head: ["Item", "Type", "Purpose", "Duration"],
            rows: [
              ["Google Fonts", "Request to a third-party service (no cookie)", "Displaying typefaces", "While the page loads"],
              ["unpkg", "Request to a third-party service (no cookie)", "Loading the site's technical libraries", "While the page loads"],
              ["Browser local storage", "Display preference", "Remembering a display setting of the site", "Until browser data is cleared"],
            ],
          } },
          { title: "Your choices", items: [
            ["You can clear local storage at any time from your browser settings, with no effect on browsing the site."],
            ["The processing of your data is described in the ", { route: "confidentialite", label: "privacy policy" }, "."],
          ] },
        ],
      },
    },
  },
};

const LEGAL_ROUTES = Object.keys(LEGAL_COPY.fr.pages);

// Un « item » est une liste de fragments : texte brut, { email }, { phone },
// { link, label } ou { route, label } (page légale interne).
const LegalFragment = ({ f }) => {
  const a = { color: "var(--accent-2)", textDecoration: "underline", textUnderlineOffset: 3, fontWeight: 500 };
  if (typeof f === "string") return f;
  if (f.email) return <a href={`mailto:${COMPANY.email}`} style={a}>{COMPANY.email}</a>;
  if (f.phone) return <a href={COMPANY.phoneHref} style={a}>{COMPANY.phone}</a>;
  if (f.route) return <a href={`#/${f.route}`} style={a}>{f.label}</a>;
  return <a href={f.link} target="_blank" rel="noreferrer" style={a}>{f.label}</a>;
};

// Retour : remonte l'historique jusqu'à la dernière page hors pages légales
// (profondeur comptée par app.jsx) → le navigateur restaure la position de
// défilement. Repli (arrivée directe) : dernier hash mémorisé ou accueil.
const LAST_PAGE_KEY = "shoptimize.lastPage";
const LEGAL_DEPTH_KEY = "shoptimize.legalDepth";
const RESTORING_KEY = "shoptimize.restoring";
Object.assign(window, { LAST_PAGE_KEY, LEGAL_DEPTH_KEY, RESTORING_KEY });
const LegalBack = ({ label }) => (
  <a href="#" onClick={(e) => {
      e.preventDefault();
      let depth = 0, last = "#";
      try {
        depth = Number(sessionStorage.getItem(LEGAL_DEPTH_KEY) || 0);
        last = sessionStorage.getItem(LAST_PAGE_KEY) || "#";
      } catch (err) {}
      if (depth > 0 && window.history.length > depth) {
        try { sessionStorage.setItem(RESTORING_KEY, "1"); } catch (err) {}
        window.history.go(-depth);
        return;
      }
      if (last.startsWith("#/") && LEGAL_ROUTES.includes(last.slice(2))) last = "#";
      window.location.hash = last === "#" ? "" : last;
      if (last === "#") window.scrollTo(0, 0);
    }}
     className="btn btn-outline" style={{ padding: "10px 16px", fontWeight: 600 }}>
    <span aria-hidden="true">←</span> {label}
  </a>
);

const LegalTable = ({ table }) => (
  <div style={{ overflowX: "auto", border: "1px solid var(--line)", borderRadius: "var(--radius)", margin: "14px 0" }}>
    <table style={{ width: "100%", borderCollapse: "collapse", fontSize: 13, textAlign: "left" }}>
      <thead style={{ background: "var(--bg-soft)" }}>
        <tr>{table.head.map(h => <th key={h} style={{ padding: "10px 12px", fontWeight: 600 }}>{h}</th>)}</tr>
      </thead>
      <tbody>
        {table.rows.map((r, i) => (
          <tr key={i} style={{ borderTop: "1px solid var(--line)", verticalAlign: "top" }}>
            {r.map((c, j) => <td key={j} style={{ padding: "10px 12px", color: j === 0 ? "var(--fg)" : "var(--muted)" }}>{c}</td>)}
          </tr>
        ))}
      </tbody>
    </table>
  </div>
);

const LegalPage = ({ page, lang }) => {
  const c = LEGAL_COPY[lang] || LEGAL_COPY.fr;
  const p = c.pages[page];
  if (!p) return null;
  return (
    <main className="section" style={{ borderTop: 0 }}>
      <div className="wrap" style={{ maxWidth: 820 }}>
        <div style={{ marginBottom: 22 }}><LegalBack label={c.back} /></div>
        <h1 style={{ fontSize: "clamp(30px, 4vw, 44px)" }}>{p.title}</h1>
        <p style={{ color: "var(--muted)", fontSize: 14, marginTop: 8 }}>{p.subtitle}</p>
        {p.sections.map(s => (
          <section key={s.title} style={{ marginTop: 32 }}>
            <h2 style={{ fontSize: 20, marginBottom: 10 }}>{s.title}</h2>
            {(s.items || []).map((it, i) => (
              <p key={i} style={{ margin: "0 0 8px", color: "var(--fg-2)", fontSize: 15, lineHeight: 1.6 }}>
                {it.map((f, j) => <LegalFragment key={j} f={f} />)}
              </p>
            ))}
            {s.table && <LegalTable table={s.table} />}
          </section>
        ))}
        <div style={{ marginTop: 40, paddingTop: 18, borderTop: "1px solid var(--line)", display: "flex", justifyContent: "space-between", alignItems: "center", gap: 12, flexWrap: "wrap" }}>
          <LegalBack label={c.back} />
          <span className="mono" style={{ color: "var(--muted)" }}>{c.updated} : {COMPANY.updated[lang] || COMPANY.updated.fr}</span>
        </div>
      </div>
    </main>
  );
};

Object.assign(window, { LegalPage, LEGAL_ROUTES, LAST_PAGE_KEY });
