/**
 * E1 — récapitulatif de simulation envoyé au lead.
 *
 * Depuis le 14/10, la copie interne E2 est remplacée par la notification
 * « Nouveau lead simulateur » (templates/nouveau-lead.ts), qui reprend ce même
 * corps en fin d'email. Ce sont deux envois distincts et non un Bcc : ils
 * restent filtrables, et la notification part même si E1 échoue (§5.1).
 */
import type { SimulationResultPayload } from "@/types/simulation-result";
import { button, esc, eur, eurSigned, h2, layout, pct, row, siteDomain, table, MUTED } from "./layout";
import { EMAIL_ENTREPRISE, LIGNE_LEGALE } from "@/config/contact";

/**
 * Corps partagé : E1 au lead, et sa copie en fin de notification interne
 * (« le client veut voir exactement ce que reçoit le lead », 08/09).
 */
export function corps(p: SimulationResultPayload, pourInterne: boolean): string {
  const r = p.resultats;
  const [actuel, portage, optimise] = r.scenarios;
  const ecartPositif = r.laisseSurLaTableSens === "gain";

  const entete = pourInterne
    ? `<p style="margin:0 0 16px 0;padding:10px 14px;background-color:#FFF1DE;border-radius:8px;font-size:13px;color:#0B0D12;">
         <strong>Copie interne</strong> — récapitulatif envoyé à ${esc(p.identite.prenom)} (${esc(p.identite.email)})${
           p.identite.telephone ? ` · ${esc(p.identite.telephone)}` : ""
         }.
       </p>`
    : "";

  // Profil sans situation actuelle : on présente le portage seul, sans
  // comparatif inventé (§4.3). Le champ vient du contrat de données.
  const accroche = !r.comparable
    ? `<p style="margin:0 0 8px 0;font-size:22px;font-weight:bold;line-height:1.3;">Votre vrai taux d'imposition du foyer : ${esc(
        pct(r.tauxMoyenImposition),
      )}.</p>
       <p style="margin:0 0 8px 0;font-size:14px;line-height:1.6;color:${MUTED};">Vous êtes en transition : il n'y a pas de situation actuelle à comparer, nous ne vous en inventons pas une. Voici ce que le portage RD optimisé vous rapporterait.</p>`
    : ecartPositif
    ? `<p style="margin:0 0 8px 0;font-size:22px;font-weight:bold;line-height:1.3;">Vous laissez ${esc(
        eur(Math.abs(r.laisseSurLaTable)),
      )} par an sur la table.</p>`
    : r.laisseSurLaTable < 0
      ? `<p style="margin:0 0 8px 0;font-size:22px;font-weight:bold;line-height:1.3;">À revenu égal, votre statut actuel vous laisse ${esc(
          eur(Math.abs(r.laisseSurLaTable)),
        )} de plus par an que le portage optimisé.</p>
         <p style="margin:0 0 8px 0;font-size:14px;line-height:1.6;color:${MUTED};">C'est le chiffre réel, sans arrondi à l'avantage du portage. Ce que le portage apporte en contrepartie ne se lit pas sur cette ligne : statut de salarié, assurance chômage, retraite et prévoyance, congés payés, sécurité juridique du contrat de travail.</p>`
      : `<p style="margin:0 0 8px 0;font-size:22px;font-weight:bold;line-height:1.3;">À revenu égal, les deux statuts vous laissent le même disponible annuel.</p>`;

  const tjmLigne =
    p.activite.tjmMode === "fourchette" && p.activite.tjmFourchette
      ? `Fourchette ${p.activite.tjmFourchette.label} (calcul sur ${eur(p.activite.tjmFourchette.mediane)})`
      : `${eur(p.activite.tjm)} (montant exact)`;

  const avantages = p.avantages.avantagesInclus
    ? p.avantages.selection
        .map((a) =>
          row(
            `${a.label} (${a.fraisDeService})`,
            a.id === "wawashi" ? `${eur(a.montantNetAnnuel)} par an` : `${eur(a.montantNetMensuel)} net/mois`,
          ),
        )
        .join("") + row("Total avantages", `${eur(p.avantages.totalNetMensuel)} net/mois`, true)
    : row("Avantages retenus", "aucun");

  return `${entete}
<p style="margin:0 0 4px 0;font-size:15px;">Bonjour ${esc(p.identite.prenom)},</p>
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.6;">Voici le récapitulatif de votre simulation du ${esc(
    p.meta.dateSimulationLabel,
  )}.</p>

${accroche}
<p style="margin:0;font-size:14px;color:${MUTED};">Votre vrai taux d'imposition du foyer : <strong style="color:#0B0D12;">${esc(
    pct(r.tauxMoyenImposition),
  )}</strong> · TMI ${esc((r.tmi * 100).toFixed(0))} %.</p>

${p.meta.dossierUrl ? button(p.meta.dossierUrl, "Ouvrir mon dossier complet") : ""}
${
  pourInterne
    ? ""
    : `<p style="margin:0 0 8px 0;font-size:13px;line-height:1.6;color:${MUTED};">Pour recevoir la suite sans passer par les spams, ajoutez ${esc(
        EMAIL_ENTREPRISE,
      )} à vos contacts. Une question ? Répondez simplement à cet email.</p>`
}

${h2("Votre situation")}
${table(
  row("Profil", p.identite.profilLabel) +
    row("TJM", tjmLigne) +
    row("Jours facturés", `${p.activite.joursFactures} / mois`) +
    row("Frais professionnels", fraisProLabel(p)) +
    row("Foyer", p.foyer.situationLabel) +
    row("Parts fiscales", String(p.foyer.nombreDeParts)) +
    row(
      "Enfants à charge",
      `${p.foyer.enfants}${p.foyer.enfantsGardeAlternee > 0 ? ` (dont ${p.foyer.enfantsGardeAlternee} en garde alternée)` : ""}`,
    ) +
    (p.foyer.revenuConjoint > 0 ? row("Revenu du conjoint", `${eur(p.foyer.revenuConjoint)} / an`) : "") +
    row("Mode de déduction", p.foyer.modeDeductionLabel) +
    (p.foyer.fraisReelsAnnuels > 0 ? row("Frais réels", `${eur(p.foyer.fraisReelsAnnuels)} / an`) : "") +
    (p.foyer.per > 0 ? row("Versements PER", `${eur(p.foyer.per)} / an`) : "") +
    (p.foyer.autresRevenus.foncier > 0 ? row("Revenus fonciers", `${eur(p.foyer.autresRevenus.foncier)} / an`) : "") +
    (p.foyer.autresRevenus.dons > 0 ? row("Dons", `${eur(p.foyer.autresRevenus.dons)} / an`) : ""),
)}

${h2("Vos avantages")}
${table(avantages)}

${h2("Votre rémunération, mois par mois")}
${table(
  row("CA HT", eur(r.mensuel.caHt)) +
    row("Frais de gestion RD", `− ${eur(r.mensuel.fraisDeGestion)}`) +
    row("Assurances & taxes", `− ${eur(r.mensuel.assurancesTaxes)}`) +
    row("Frais professionnels", `− ${eur(r.mensuel.fraisPro)}`) +
    row("Cagnotte avantages (frais inclus)", `− ${eur(r.mensuel.cagnotteCout ?? r.mensuel.cagnotte)}`) +
    row("Disponible compte d'activité", eur(r.mensuel.disponible)) +
    row("Salaire brut", eur(r.mensuel.brut)) +
    row("Cotisations salariales", `− ${eur(r.mensuel.cotisationsSalariales)}`) +
    row("Net versé", eur(r.mensuel.netVerse)) +
    (p.avantages.titresResto.inclus ? row("Titres-restaurant", `+ ${eur(r.mensuel.titresResto)}`) : "") +
    row("Perçu net", eur(r.mensuel.percuNet), true) +
    row("Rémunération globale", eur(r.mensuel.remunerationGlobale), true) +
    row("Taux de restitution, avant impôt sur le revenu", pct(r.tauxRestitution), true) +
    (r.tauxAvantages ? row("dont avantages, non retirables en argent", pct(r.tauxAvantages)) : ""),
)}

${
  r.comparable
    ? `${h2("Les trois scénarios comparés")}
${table(
  row(actuel.label, `${eur(actuel.disponible)} / an`) +
    row(portage.label, `${eur(portage.disponible)} / an`) +
    row(optimise.label, `${eur(optimise.disponible)} / an`, true) +
    row("Écart (optimisé − actuel)", `${eurSigned(r.laisseSurLaTable)} / an`, true),
)}`
    : `${h2("Votre portage RD optimisé")}
${table(
  row("Net perçu", `${eur(optimise.netPercu)} / an`, true) +
    row("Avantages", `${eur(optimise.avantages)} / an`) +
    row("Impôt du foyer", `− ${eur(optimise.impotFoyer)} / an`) +
    row("Disponible", `${eur(optimise.disponible)} / an`, true),
)}`
}

${h2("Votre impôt")}
${table(
  row("Net imposable annuel", eur(r.netImposableAnnuel)) +
    row("Impôt net", eur(r.impotNet)) +
    row("Taux moyen d'imposition", pct(r.tauxMoyenImposition)) +
    row("Tranche marginale (TMI)", `${(r.tmi * 100).toFixed(0)} %`),
)}

<p style="margin:20px 0 0 0;font-size:13px;line-height:1.6;color:${MUTED};">Référence de simulation : ${esc(
    p.meta.simulationId,
  )}</p>`;
}

/** #12 : les frais pro saisis, et ce qui est retenu après la limite de 30 % du brut. */
function fraisProLabel(p: SimulationResultPayload): string {
  const saisis = p.activite.fraisProMensuels;
  const retenus = p.resultats.mensuel.fraisPro;
  if (!(saisis > 0)) return "aucun";
  return retenus < saisis
    ? `${eur(saisis)} / mois saisis, ${eur(retenus)} retenus (limite de 30 % du salaire brut, règle interne RD Portage)`
    : `${eur(saisis)} / mois`;
}

function texte(p: SimulationResultPayload, unsubscribeUrl?: string): string {
  const r = p.resultats;
  const lignes = [
    `Bonjour ${p.identite.prenom},`,
    ``,
    `Récapitulatif de votre simulation du ${p.meta.dateSimulationLabel}.`,
    ``,
    !r.comparable
      ? `Votre vrai taux d'imposition du foyer : ${pct(r.tauxMoyenImposition)}. Vous êtes en transition : il n'y a pas de situation actuelle à comparer, nous ne vous en inventons pas une.`
      : r.laisseSurLaTableSens === "gain"
      ? `Vous laissez ${eur(Math.abs(r.laisseSurLaTable))} par an sur la table.`
      : r.laisseSurLaTable < 0
        ? `À revenu égal, votre statut actuel vous laisse ${eur(Math.abs(r.laisseSurLaTable))} de plus par an que le portage optimisé. En contrepartie, le portage apporte le statut de salarié, l'assurance chômage, la retraite et la prévoyance, les congés payés et la sécurité juridique du contrat de travail.`
        : `À revenu égal, les deux statuts vous laissent le même disponible annuel.`,
    ``,
    `Taux moyen d'imposition du foyer : ${pct(r.tauxMoyenImposition)} — TMI ${(r.tmi * 100).toFixed(0)} %.`,
    ``,
    `VOTRE SITUATION`,
    `- Profil : ${p.identite.profilLabel}`,
    `- TJM : ${
      p.activite.tjmMode === "fourchette" && p.activite.tjmFourchette
        ? `fourchette ${p.activite.tjmFourchette.label}, calcul sur ${eur(p.activite.tjmFourchette.mediane)}`
        : `${eur(p.activite.tjm)} (montant exact)`
    }`,
    `- Jours facturés : ${p.activite.joursFactures} / mois`,
    `- Frais professionnels : ${fraisProLabel(p)}`,
    `- Foyer : ${p.foyer.situationLabel}, ${p.foyer.nombreDeParts} part(s), ${p.foyer.enfants} enfant(s)`,
    `- Mode de déduction : ${p.foyer.modeDeductionLabel}`,
    ``,
    `VOS AVANTAGES`,
    p.avantages.avantagesInclus
      ? p.avantages.selection
          .map((a) =>
            a.id === "wawashi"
              ? `- ${a.label} : ${eur(a.montantNetAnnuel)} par an (${a.fraisDeService})`
              : `- ${a.label} : ${eur(a.montantNetMensuel)} net/mois (${a.fraisDeService})`,
          )
          .join("\n")
      : `- Aucun avantage retenu.`,
    ``,
    `VOTRE RÉMUNÉRATION MENSUELLE`,
    `- CA HT : ${eur(r.mensuel.caHt)}`,
    `- Disponible compte d'activité : ${eur(r.mensuel.disponible)}`,
    `- Salaire brut : ${eur(r.mensuel.brut)}`,
    `- Perçu net : ${eur(r.mensuel.percuNet)}`,
    `- Rémunération globale : ${eur(r.mensuel.remunerationGlobale)}`,
    `- Taux de restitution, avant impôt sur le revenu : ${pct(r.tauxRestitution)}${
      r.tauxAvantages ? ` (dont ${pct(r.tauxAvantages)} en avantages, non retirables en argent)` : ""
    }`,
    ``,
    ...(r.comparable
      ? [
          `LES TROIS SCÉNARIOS (disponible annuel)`,
          ...r.scenarios.map((s) => `- ${s.label} : ${eur(s.disponible)}`),
          `- Écart (optimisé − actuel) : ${eurSigned(r.laisseSurLaTable)}`,
        ]
      : [
          `VOTRE PORTAGE RD OPTIMISÉ (annuel)`,
          `- Net perçu : ${eur(r.scenarios[2].netPercu)}`,
          `- Disponible : ${eur(r.scenarios[2].disponible)}`,
          `(Vous êtes en transition : pas de situation actuelle à comparer.)`,
        ]),
    ``,
    p.meta.dossierUrl ? `Votre dossier complet : ${p.meta.dossierUrl}` : ``,
    ``,
    p.meta.mentions.valeurIndicative,
    `Référence de simulation : ${p.meta.simulationId}`,
    `Politique de confidentialité : ${p.meta.mentions.politiqueConfidentialiteUrl}`,
    // #13 : la version texte porte aussi le lien de désinscription.
    unsubscribeUrl ? `Se désinscrire : ${unsubscribeUrl}` : ``,
    LIGNE_LEGALE,
  ];
  return lignes.filter((l) => l !== undefined).join("\n");
}

/** Pied RGPD de l'email au lead (§5.2). */
function piedLead(p: SimulationResultPayload, unsubscribeUrl?: string): string {
  return [
    esc(p.meta.mentions.valeurIndicative),
    `Vous recevez cet email parce que vous avez demandé votre simulation sur ${esc(siteDomain(p.meta.mentions.politiqueConfidentialiteUrl))}. Vos données servent uniquement à établir cette simulation et à vous recontacter à ce sujet.`,
    `<a href="${esc(p.meta.mentions.politiqueConfidentialiteUrl)}" style="color:${MUTED};">Politique de confidentialité</a> · <a href="${esc(
      p.meta.mentions.mentionsLegalesUrl,
    )}" style="color:${MUTED};">Mentions légales</a>${
      unsubscribeUrl ? ` · <a href="${esc(unsubscribeUrl)}" style="color:${MUTED};">Se désinscrire</a>` : ""
    }`,
    esc(LIGNE_LEGALE),
  ].join("<br>");
}

export function emailRecapLead(p: SimulationResultPayload, unsubscribeUrl?: string) {
  return {
    subject: `${p.identite.prenom}, votre simulation RD Portage`,
    html: layout({
      title: "Votre simulation RD Portage",
      preheader:
        p.resultats.comparable && p.resultats.laisseSurLaTableSens === "gain"
          ? `Vous laissez ${eur(Math.abs(p.resultats.laisseSurLaTable))} par an sur la table.`
          : `Votre vrai taux d'imposition du foyer : ${pct(p.resultats.tauxMoyenImposition)}.`,
      body: corps(p, false),
      footer: piedLead(p, unsubscribeUrl),
    }),
    text: texte(p, unsubscribeUrl),
  };
}
