import puppeteer from "puppeteer";
import type { AnalysisResult } from "./analysis";

function escapeHtml(value: string): string {
  return value
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;");
}

function li(items: string[]): string {
  if (!items.length) return "<li>Rien à signaler à ce stade.</li>";
  return items.map((x) => `<li>${escapeHtml(x)}</li>`).join("");
}

export interface PppData {
  pharmacyName: string;
  patientName: string;
  ageRange?: string;
  analysis: AnalysisResult;
}

function renderPppHtml(data: PppData): string {
  const top = data.analysis.topPriorities;

  return `<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<style>
  *{box-sizing:border-box}
  body{font-family:Arial, Helvetica, sans-serif;color:#142033;margin:0;padding:24px}
  .header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:18px}
  .small{font-size:12px;color:#657084}
  .title{color:#07008b;font-size:24px;font-weight:900;line-height:1.05}
  .patient{font-size:13px;color:#142033;margin-top:4px}
  .age{color:#10a37f;font-weight:900;font-size:14px}
  .ppp{border:3px solid #07008b;border-radius:8px;padding:18px}
  .grid{display:grid;grid-template-columns:1fr 1fr;gap:0;border-top:1px solid #6ed4ca;border-left:1px solid #6ed4ca}
  .cell{border-right:1px solid #6ed4ca;border-bottom:1px solid #6ed4ca;padding:12px;font-size:12px;line-height:1.4}
  .cell h4{display:inline-block;margin:0 0 8px;background:#10a37f;color:#fff;border-radius:999px;padding:6px 10px;font-size:12px}
  .cell ul{margin:8px 0 0 16px;padding:0}
  .follow{margin-top:14px;border:1px solid #6ed4ca;border-radius:12px;padding:12px}
  .follow h4{display:inline-block;margin:0 0 8px;background:#10a37f;color:#fff;border-radius:999px;padding:6px 10px;font-size:12px}
  .notice{background:#fff7ed;border:1px solid #fed7aa;border-radius:10px;padding:10px 12px;color:#7c2d12;font-size:11px;margin-top:16px;line-height:1.4}
</style>
</head>
<body>
  <div class="header">
    <div>
      <div class="small">Mon Bilan Prévention — ${escapeHtml(data.pharmacyName)}</div>
      <div class="title">Plan Personnalisé<br>de Prévention</div>
      <div class="patient">Patient : ${escapeHtml(data.patientName)}</div>
    </div>
    <div class="age">${data.ageRange ? escapeHtml(data.ageRange) + " ans" : ""}</div>
  </div>

  <div class="ppp">
    <div class="grid">
      <div class="cell">
        <h4>Mes priorités en santé</h4>
        <ul>${li(top.map((p) => p.priority))}</ul>
      </div>
      <div class="cell">
        <h4>Freins rencontrés</h4>
        <ul>${li(top.map((p) => p.frein))}</ul>
      </div>
      <div class="cell">
        <h4>Conseils, modalités pratiques</h4>
        <ul>${li(top.map((p) => p.conseil))}</ul>
      </div>
      <div class="cell">
        <h4>Ressources et intervenants</h4>
        <ul>${li(top.map((p) => p.ressource))}</ul>
      </div>
    </div>
    <div class="follow">
      <h4>Modalités de suivi</h4>
      <ul>${li(top.map((p) => p.suivi))}</ul>
    </div>
  </div>

  <p class="notice">
    Ce document aide à structurer un repérage et un plan de prévention. Il ne remplace pas l'évaluation
    clinique, le jugement du professionnel de santé, ni une consultation médicale.
  </p>
</body>
</html>`;
}

export async function generatePppPdf(data: PppData): Promise<Buffer> {
  const html = renderPppHtml(data);
  const browser = await puppeteer.launch({ headless: true, args: ["--no-sandbox"] });
  try {
    const page = await browser.newPage();
    await page.setContent(html, { waitUntil: "load" });
    const pdf = await page.pdf({ format: "A4", printBackground: true, margin: { top: "16mm", bottom: "16mm", left: "12mm", right: "12mm" } });
    return Buffer.from(pdf);
  } finally {
    await browser.close();
  }
}
