function PdfHeader({ plan }) {
  return (
    <div className="pdf-header">
      <div className="pdf-header__brand">
        <img src="assets/blife-symbol-molecule.svg" alt="" />
        <div className="pdf-header__brand-text">
          <span className="name">Plano de Ação</span>
          <span className="sub">B-Life Clinic</span>
        </div>
      </div>
      <div className="pdf-header__meta">
        <span>Paciente · {plan.patient.name || '—'}</span>
        <span className="processo">Processo {plan.patient.processo || '—'}</span>
      </div>
    </div>
  );
}

function PdfFooter({ pageNum, totalPages }) {
  return (
    <div className="pdf-footer">
      <span className="pdf-footer__brand">B-Life Clinic · b-life.clinic</span>
      <span>Plano de carácter informativo · não substitui orientação clínica</span>
      <span className="pdf-footer__page">{String(pageNum).padStart(2, '0')} / {String(totalPages).padStart(2, '0')}</span>
    </div>
  );
}

function CoverPage({ plan, variant = 'cream' }) {
  const firstName = (plan.patient.name || '').split(' ')[0] || '';
  return (
    <div className={`pdf-page pdf-page--cover ${variant === 'forest' ? 'pdf-page--cover-forest' : ''} ${variant === 'bold' ? 'pdf-page--cover-bold' : ''}`}>
      <div className="cover">
        <div className="cover__top">
          <div className="cover__brand">
            <img src="assets/blife-symbol-molecule.svg" alt="" />
            <div className="cover__brand-meta">
              <span className="name">B-Life Clinic</span>
              <span className="sub">b-life.clinic</span>
            </div>
          </div>
          <div className="cover__doc-id">
            Documento Nº
            <span className="num">{plan.patient.processo || '—'}</span>
          </div>
        </div>

        <div className="cover__hero">
          <div className="cover__eyebrow">Plano de Ação Personalizado</div>
          <h1 className="cover__title">
            Um plano para <em>{firstName || 'cuidar de si'}</em>.
          </h1>
          <p className="cover__intro">
            Este documento reúne os objetivos, recomendações e prescrições
            definidos em consulta. Cada secção foi elaborada para integrar
            estilo de vida, suplementação e seguimento médico de forma
            personalizada.
          </p>
        </div>

        <div className="cover__patient">
          <div className="cover__patient-cell">
            <span className="label">Paciente</span>
            <span className="value">{plan.patient.name || '—'}</span>
          </div>
          <div className="cover__patient-cell">
            <span className="label">Processo</span>
            <span className="value">{plan.patient.processo || '—'}</span>
          </div>
          <div className="cover__patient-cell">
            <span className="label">SNS</span>
            <span className="value value-sm">{plan.patient.sns || '—'}</span>
          </div>
        </div>

        <div className="cover__signature">
          <div className="cover__doctor">
            <span className="label">Médico Responsável</span>
            <span className="name">{plan.doctor.name ? `Dra. ${plan.doctor.name}` : '—'}</span>
            <span className="spec">{plan.doctor.specialty || '—'}</span>
          </div>
          <div className="cover__date">
            Emitido em
            <span className="val">{formatDate(plan.doctor.date)}</span>
          </div>
        </div>

        {variant !== 'forest' && (
          <div className="cover__blob">
            <svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
              <defs>
                <filter id="cover-goo">
                  <feGaussianBlur in="SourceGraphic" stdDeviation="4" />
                  <feColorMatrix mode="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 22 -10" />
                </filter>
                <radialGradient id="blob-grad" cx="40%" cy="40%">
                  <stop offset="0%" stopColor="#74B0A8" />
                  <stop offset="100%" stopColor="#04261E" />
                </radialGradient>
              </defs>
              <g fill="url(#blob-grad)" filter="url(#cover-goo)" opacity="0.92">
                <circle cx="80" cy="70" r="48" />
                <circle cx="130" cy="110" r="58" />
                <circle cx="90" cy="140" r="44" />
                <circle cx="150" cy="60" r="22" />
              </g>
            </svg>
          </div>
        )}
      </div>
    </div>
  );
}

function PatientStrip({ plan }) {
  return (
    <div className="pdf-patient-strip">
      <div className="pdf-patient-strip__cell">
        <span className="label">Paciente</span>
        <span className="value">{plan.patient.name || '—'}</span>
      </div>
      <div className="pdf-patient-strip__cell">
        <span className="label">Processo</span>
        <span className="value">{plan.patient.processo || '—'}</span>
      </div>
      <div className="pdf-patient-strip__cell">
        <span className="label">Médico</span>
        <span className="value">{plan.doctor.name ? `Dra. ${plan.doctor.name}` : '—'}</span>
      </div>
      <div className="pdf-patient-strip__cell">
        <span className="label">Data</span>
        <span className="value">{formatDate(plan.doctor.date)}</span>
      </div>
    </div>
  );
}

function Section({ num, title, sub, children }) {
  return (
    <section className="pdf-section">
      <div className="pdf-section__head">
        <span className="pdf-section__num">{num}</span>
        <h3 className="pdf-section__title">{title}</h3>
        {sub && <span className="pdf-section__sub">{sub}</span>}
      </div>
      <div className="pdf-section__body">{children}</div>
    </section>
  );
}

function PdfBullets({ items }) {
  const list = (items || []).filter(s => s && s.trim());
  if (!list.length) return <em style={{ color: 'var(--ink-secondary)', fontSize: '8.5pt' }}>— Sem registo</em>;
  return (
    <ul className="pdf-list">
      {list.map((it, i) => <li key={i}>{it}</li>)}
    </ul>
  );
}

function PageOverview({ plan, pageNum, totalPages }) {
  return (
    <div className="pdf-page">
      <div className="pdf-page__inner">
        <PdfHeader plan={plan} />
        <PatientStrip plan={plan} />

        {plan.objectives.some(o => o && o.trim()) && (
          <div className="pdf-objectives">
            <div className="pdf-objectives__head">
              <span className="pdf-objectives__icon">
                <Icon name="target" size={10} />
              </span>
              <span className="pdf-objectives__title">Objetivos deste plano</span>
            </div>
            <ol className="pdf-objectives__list">
              {plan.objectives.filter(o => o && o.trim()).map((o, i) => (
                <li key={i}>{o}</li>
              ))}
            </ol>
          </div>
        )}

        <Section num="04" title="Atividade física" sub={`${plan.exercise.filter(s => s && s.trim()).length} recomendações`}>
          <PdfBullets items={plan.exercise} />
        </Section>

        <Section num="05" title="Alimentação" sub={`${plan.nutrition.filter(s => s && s.trim()).length} recomendações`}>
          <PdfBullets items={plan.nutrition} />
        </Section>

        <PdfFooter pageNum={pageNum} totalPages={totalPages} />
      </div>
    </div>
  );
}

function SupplementSubcard({ group }) {
  const items = group.items.filter(i => i.name && i.name.trim());
  if (!items.length) return null;
  return (
    <div className="pdf-subcard">
      <div className="pdf-subcard__head">
        <div className="pdf-subcard__title">
          <span className="pdf-subcard__icon">
            <Icon name={iconForGroup(group.group)} size={9} />
          </span>
          {group.group}
        </div>
        <span className="pdf-subcard__count">{items.length} {items.length === 1 ? 'item' : 'itens'}</span>
      </div>
      <table className="pdf-table">
        <thead>
          <tr>
            <th className="col-name">Suplemento</th>
            <th className="col-dose">Dose</th>
            <th className="col-freq">Frequência</th>
          </tr>
        </thead>
        <tbody>
          {items.map((it, i) => (
            <tr key={i}>
              <td className="col-name">
                {it.name}
                {it.notes && it.notes.trim() && (
                  <div style={{ fontSize: '7.5pt', color: 'var(--ink-secondary)', fontStyle: 'italic', marginTop: 1 }}>
                    {it.notes}
                  </div>
                )}
              </td>
              <td className="col-dose">{it.dose || '—'}</td>
              <td className="col-freq">{it.frequency || '—'}</td>
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );
}

function PageSupplements({ plan, pageNum, totalPages, groupsSlice }) {
  return (
    <div className="pdf-page">
      <div className="pdf-page__inner">
        <PdfHeader plan={plan} />

        {groupsSlice.isFirst && (
          <Section num="06" title="Prescrições" sub={`${plan.prescription.filter(s => s && s.trim()).length} indicações`}>
            <PdfBullets items={plan.prescription} />
          </Section>
        )}

        <Section
          num="07"
          title={groupsSlice.isFirst ? 'Suplementos' : 'Suplementos (cont.)'}
          sub={groupsSlice.isFirst ? `${plan.supplements.length} grupos terapêuticos` : ''}
        >
          {groupsSlice.groups.map((g, i) => (
            <SupplementSubcard key={i} group={g} />
          ))}
        </Section>

        <PdfFooter pageNum={pageNum} totalPages={totalPages} />
      </div>
    </div>
  );
}

function PagePeptides({ plan, pageNum, totalPages, withFollowups }) {
  const peps = plan.peptides.filter(p => p.name && p.name.trim());
  const fups = plan.followups.filter(f => f.title && f.title.trim());

  return (
    <div className="pdf-page">
      <div className="pdf-page__inner">
        <PdfHeader plan={plan} />

        {peps.length > 0 && (
          <Section num="08" title="Peptide Therapy" sub={`${peps.length} peptídeos prescritos`}>
            <div className="pdf-subcard">
              <table className="pdf-table">
                <thead>
                  <tr>
                    <th className="col-name">Peptídeo</th>
                    <th className="col-dose">Dose</th>
                    <th className="col-freq" style={{ width: '32%' }}>Frequência / Via</th>
                  </tr>
                </thead>
                <tbody>
                  {peps.map((p, i) => (
                    <tr key={i}>
                      <td className="col-name">{p.name}</td>
                      <td className="col-dose">{p.dose || '—'}</td>
                      <td className="col-freq">{p.frequency || '—'}</td>
                    </tr>
                  ))}
                </tbody>
              </table>
            </div>
          </Section>
        )}

        {withFollowups && fups.length > 0 && (
          <Section num="09" title="Próximas consultas" sub={`${fups.length} marcações`}>
            {fups.map((f, i) => (
              <div key={i} className="pdf-followup">
                <div>
                  <div className="pdf-followup__title">{f.title}</div>
                  {f.notes && <div className="pdf-followup__notes">{f.notes}</div>}
                </div>
                <div className="pdf-followup__date">{f.date || '—'}</div>
              </div>
            ))}
          </Section>
        )}

        {withFollowups && plan.notes && plan.notes.trim() && (
          <div className="pdf-importante" style={{ marginTop: 14 }}>
            <strong>Importante.</strong> {plan.notes}
          </div>
        )}

        <PdfFooter pageNum={pageNum} totalPages={totalPages} />
      </div>
    </div>
  );
}

function PageFollowups({ plan, pageNum, totalPages, showFollowups, showNotes }) {
  const fups = plan.followups.filter(f => f.title && f.title.trim());
  return (
    <div className="pdf-page">
      <div className="pdf-page__inner">
        <PdfHeader plan={plan} />

        {showFollowups && fups.length > 0 && (
          <Section num="09" title="Próximas consultas" sub={`${fups.length} marcações`}>
            {fups.map((f, i) => (
              <div key={i} className="pdf-followup">
                <div>
                  <div className="pdf-followup__title">{f.title}</div>
                  {f.notes && <div className="pdf-followup__notes">{f.notes}</div>}
                </div>
                <div className="pdf-followup__date">{f.date || '—'}</div>
              </div>
            ))}
          </Section>
        )}

        {showNotes && plan.notes && plan.notes.trim() && (
          <Section num="10" title="Observações finais">
            <div style={{ fontSize: '10pt', lineHeight: 1.55, color: 'var(--ink)' }}>{plan.notes}</div>
          </Section>
        )}

        <div className="pdf-importante">
          <strong>Importante.</strong> Este plano de ação tem carácter exclusivamente informativo e destina-se a apoiar
          o seu envolvimento com a própria saúde. Não substitui orientação clínica nem serve para diagnosticar,
          monitorizar ou tratar doenças. A interpretação destes dados deve ser feita no contexto de uma avaliação
          integrada e personalizada conduzida pela sua equipa clínica B-Life.
        </div>

        <PdfFooter pageNum={pageNum} totalPages={totalPages} />
      </div>
    </div>
  );
}

function buildPages(plan, coverVariant) {
  const pages = [];
  pages.push({ kind: 'cover', render: (n, t) => <CoverPage plan={plan} variant={coverVariant} key="cover" /> });
  pages.push({ kind: 'overview', render: (n, t) => <PageOverview plan={plan} pageNum={n} totalPages={t} key="overview" /> });

  const groups = plan.supplements.filter(g => g.items.some(i => i.name && i.name.trim()));
  const GROUPS_PER_PAGE_1 = 3;
  const GROUPS_PER_PAGE_N = 4;

  if (groups.length === 0 && plan.prescription.some(s => s && s.trim())) {
    pages.push({
      kind: 'suppl',
      render: (n, t) => (
        <PageSupplements plan={plan} pageNum={n} totalPages={t}
          groupsSlice={{ isFirst: true, groups: [] }} key="suppl-0" />
      ),
    });
  } else if (groups.length > 0) {
    let idx = 0;
    let isFirst = true;
    while (idx < groups.length) {
      const take = isFirst ? GROUPS_PER_PAGE_1 : GROUPS_PER_PAGE_N;
      const slice = groups.slice(idx, idx + take);
      const captureFirst = isFirst;
      const captureIdx = idx;
      pages.push({
        kind: 'suppl',
        render: (n, t) => (
          <PageSupplements plan={plan} pageNum={n} totalPages={t}
            groupsSlice={{ isFirst: captureFirst, groups: slice }}
            key={`suppl-${captureIdx}`} />
        ),
      });
      idx += take;
      isFirst = false;
    }
  }

  const peps = plan.peptides.filter(p => p.name && p.name.trim());
  const fups = plan.followups.filter(f => f.title && f.title.trim());
  const hasPeps = peps.length > 0;
  const hasFups = fups.length > 0;
  const hasNotes = plan.notes && plan.notes.trim();

  if (hasPeps && peps.length <= 6 && (hasFups || hasNotes) && fups.length <= 3) {
    pages.push({
      kind: 'peps',
      render: (n, t) => <PagePeptides plan={plan} pageNum={n} totalPages={t} withFollowups={true} key="peps" />,
    });
  } else {
    if (hasPeps) {
      pages.push({
        kind: 'peps',
        render: (n, t) => <PagePeptides plan={plan} pageNum={n} totalPages={t} withFollowups={false} key="peps" />,
      });
    }
    if (hasFups || hasNotes) {
      pages.push({
        kind: 'final',
        render: (n, t) => (
          <PageFollowups plan={plan} pageNum={n} totalPages={t}
            showFollowups={hasFups} showNotes={!!hasNotes} key="final" />
        ),
      });
    }
  }

  return pages;
}

function PdfPageWrapper({ zoom, children }) {
  const W = 793.7;
  const H = 1122.5;
  return (
    <div style={{
      width: W * zoom,
      height: H * zoom,
      position: 'relative',
      flexShrink: 0,
    }}>
      <div style={{
        position: 'absolute',
        top: 0, left: 0,
        width: W,
        height: H,
        transform: `scale(${zoom})`,
        transformOrigin: 'top left',
      }}>
        {children}
      </div>
    </div>
  );
}

function PdfPreview({ plan, zoom, setZoom, coverVariant }) {
  const pages = buildPages(plan, coverVariant);
  const total = pages.length;

  return (
    <div className="preview-pane">
      <div className="preview-pane__toolbar">
        <div className="preview-pane__toolbar-label">
          <span className="eyebrow">Preview · PDF</span>
          <span className="title">{total} {total === 1 ? 'página' : 'páginas'} · A4 · 210×297mm</span>
        </div>
        <div className="zoom-group">
          {[
            { v: 0.45, l: '45%' },
            { v: 0.6,  l: '60%' },
            { v: 0.75, l: '75%' },
            { v: 1.0,  l: '100%' },
          ].map(o => (
            <button
              key={o.v}
              className={`zoom-btn ${Math.abs(zoom - o.v) < 0.01 ? 'zoom-btn--active' : ''}`}
              onClick={() => setZoom(o.v)}
            >{o.l}</button>
          ))}
        </div>
      </div>
      <div className="preview-pane__stack">
        {pages.map((p, i) => (
          <PdfPageWrapper key={i} zoom={zoom}>
            {p.render(i + 1, total)}
          </PdfPageWrapper>
        ))}
      </div>
    </div>
  );
}

Object.assign(window, { PdfPreview, buildPages });
