/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/utils/lgpdExportFormats.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/

import { htmlToPdfDownload } from '@/services/pdf.service';

function htmlEscape(s) {
    if (s === null || s === undefined) return '';
    return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}

function fmtDate(iso) {
    if (!iso) return '';
    try {
        return new Date(iso).toLocaleString('pt-BR', {
            day: '2-digit',
            month: '2-digit',
            year: 'numeric',
            hour: '2-digit',
            minute: '2-digit'
        });
    } catch {
        return String(iso);
    }
}

function fmtBRL(cents) {
    if (cents === null || cents === undefined) return '';
    const n = typeof cents === 'number' ? cents / 100 : Number(cents) / 100;
    if (!isFinite(n)) return '';
    return n.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' });
}

function renderKV(label, value) {
    if (value === null || value === undefined || value === '') return '';
    return `<div class="kv"><span class="k">${htmlEscape(label)}:</span> <span class="v">${htmlEscape(value)}</span></div>`;
}

function renderSectionHeader(title, count) {
    const badge = count != null ? `<span class="count">${count}</span>` : '';
    return `<h2>${htmlEscape(title)} ${badge}</h2>`;
}

function renderTable(headers, rows) {
    if (!rows || !rows.length) {
        return '<p class="empty">Sem registros.</p>';
    }
    const th = headers.map((h) => `<th>${htmlEscape(h.label)}</th>`).join('');
    const body = rows
        .map(
            (r) =>
                '<tr>' +
                headers
                    .map((h) => {
                        const raw = h.get ? h.get(r) : r[h.key];
                        return `<td>${htmlEscape(raw ?? '')}</td>`;
                    })
                    .join('') +
                '</tr>'
        )
        .join('');
    return `<table><thead><tr>${th}</tr></thead><tbody>${body}</tbody></table>`;
}

export function buildLgpdHTML(payload, tenantName) {
    if (!payload) return '';

    const meta = payload.export_metadata || {};
    const p = payload.paciente || {};

    const sections = [];

    // ── Cabeçalho LGPD ─────────────────────────────────────────────────────
    sections.push(`
        <div class="cover">
            <h1>Relatório de Dados Pessoais</h1>
            <p class="lead">
                Documento gerado em atendimento ao <strong>art. 18, II da LGPD</strong>
                (portabilidade de dados do titular).
            </p>
            <div class="meta">
                ${renderKV('Controlador', tenantName || 'AgênciaPSI')}
                ${renderKV('Gerado em', fmtDate(meta.generated_at))}
                ${renderKV('Fundamento', meta.lgpd_basis)}
                ${renderKV('Versão do formato', meta.format_version)}
            </div>
        </div>
    `);

    // ── Dados pessoais ─────────────────────────────────────────────────────
    sections.push(renderSectionHeader('1. Dados pessoais do titular'));
    sections.push(`
        <div class="grid">
            ${renderKV('Nome completo', p.nome_completo)}
            ${renderKV('Nome social', p.nome_social)}
            ${renderKV('Apelido', p.apelido)}
            ${renderKV('CPF', p.cpf)}
            ${renderKV('RG', p.rg)}
            ${renderKV('Data de nascimento', p.data_nascimento)}
            ${renderKV('Gênero', p.genero)}
            ${renderKV('Estado civil', p.estado_civil)}
            ${renderKV('Profissão', p.profissao)}
            ${renderKV('Escolaridade', p.escolaridade)}
            ${renderKV('Telefone', p.telefone)}
            ${renderKV('E-mail', p.email)}
            ${renderKV('Endereço', [p.endereco_logradouro, p.endereco_numero, p.endereco_bairro, p.endereco_cidade, p.endereco_uf, p.endereco_cep].filter(Boolean).join(', '))}
            ${renderKV('Status atual', p.status)}
            ${renderKV('Data de criação do cadastro', fmtDate(p.created_at))}
        </div>
    `);

    // ── Contatos ───────────────────────────────────────────────────────────
    const contatos = payload.contatos || [];
    sections.push(renderSectionHeader('2. Contatos', contatos.length));
    sections.push(
        renderTable(
            [
                { label: 'Nome', key: 'nome' },
                { label: 'Tipo', key: 'tipo' },
                { label: 'Relação', key: 'relacao' },
                { label: 'Telefone', key: 'telefone' },
                { label: 'E-mail', key: 'email' }
            ],
            contatos
        )
    );

    // ── Contatos de apoio ──────────────────────────────────────────────────
    const apoio = payload.contatos_apoio || [];
    sections.push(renderSectionHeader('3. Contatos de apoio', apoio.length));
    sections.push(
        renderTable(
            [
                { label: 'Nome', key: 'nome' },
                { label: 'Vínculo', key: 'vinculo' },
                { label: 'Telefone', key: 'telefone' }
            ],
            apoio
        )
    );

    // ── Histórico de status ────────────────────────────────────────────────
    const status = payload.historico_status || [];
    sections.push(renderSectionHeader('4. Histórico de status', status.length));
    sections.push(
        renderTable(
            [
                { label: 'Data', key: 'alterado_em', get: (r) => fmtDate(r.alterado_em) },
                { label: 'Anterior', key: 'status_anterior' },
                { label: 'Novo', key: 'status_novo' },
                { label: 'Motivo', key: 'motivo' }
            ],
            status
        )
    );

    // ── Eventos de agenda ──────────────────────────────────────────────────
    const agenda = payload.eventos_agenda || [];
    sections.push(renderSectionHeader('5. Eventos de agenda', agenda.length));
    sections.push(
        renderTable(
            [
                { label: 'Início', key: 'inicio_em', get: (r) => fmtDate(r.inicio_em) },
                { label: 'Tipo', key: 'tipo' },
                { label: 'Status', key: 'status' },
                { label: 'Observações', key: 'observacoes' }
            ],
            agenda
        )
    );

    // ── Registros financeiros ──────────────────────────────────────────────
    const financeiro = payload.registros_financeiros || [];
    sections.push(renderSectionHeader('6. Registros financeiros', financeiro.length));
    sections.push(
        renderTable(
            [
                { label: 'Criado em', key: 'created_at', get: (r) => fmtDate(r.created_at) },
                { label: 'Vencimento', key: 'due_date' },
                { label: 'Valor', key: 'amount', get: (r) => fmtBRL(r.amount) },
                { label: 'Valor final', key: 'final_amount', get: (r) => fmtBRL(r.final_amount) },
                { label: 'Status', key: 'status' },
                { label: 'Método', key: 'payment_method' }
            ],
            financeiro
        )
    );

    // ── Documentos ─────────────────────────────────────────────────────────
    const docs = payload.documentos || [];
    sections.push(renderSectionHeader('7. Documentos', docs.length));
    sections.push(
        renderTable(
            [
                { label: 'Nome', key: 'nome_original' },
                { label: 'Tipo', key: 'tipo_documento' },
                { label: 'Categoria', key: 'categoria' },
                { label: 'Tamanho (bytes)', key: 'tamanho_bytes' },
                { label: 'Upload em', key: 'uploaded_at', get: (r) => fmtDate(r.uploaded_at) }
            ],
            docs
        )
    );

    // ── Notificações ───────────────────────────────────────────────────────
    const notifs = payload.notificacoes_enviadas || [];
    sections.push(renderSectionHeader('8. Notificações enviadas', notifs.length));
    sections.push(
        renderTable(
            [
                { label: 'Data', key: 'created_at', get: (r) => fmtDate(r.created_at) },
                { label: 'Canal', key: 'channel' },
                { label: 'Destinatário', key: 'recipient_address' },
                { label: 'Status', key: 'status' }
            ],
            notifs
        )
    );

    // ── Audit trail ────────────────────────────────────────────────────────
    const audit = payload.audit_trail || [];
    sections.push(renderSectionHeader('9. Auditoria de alterações', audit.length));
    sections.push(
        renderTable(
            [
                { label: 'Data', key: 'created_at', get: (r) => fmtDate(r.created_at) },
                { label: 'Ação', key: 'action' },
                { label: 'Campos alterados', key: 'changed_fields', get: (r) => (r.changed_fields || []).join(', ') }
            ],
            audit
        )
    );

    // ── Acessos a documentos ───────────────────────────────────────────────
    const acessos = payload.acessos_a_documentos || [];
    sections.push(renderSectionHeader('10. Acessos a documentos', acessos.length));
    sections.push(
        renderTable(
            [
                { label: 'Data', key: 'acessado_em', get: (r) => fmtDate(r.acessado_em) },
                { label: 'Ação', key: 'acao' }
            ],
            acessos
        )
    );

    return `<!doctype html>
<html lang="pt-BR">
<head>
<meta charset="utf-8" />
<title>Relatório LGPD - ${htmlEscape(p.nome_completo || 'paciente')}</title>
<style>
    * { box-sizing: border-box; }
    body { font-family: 'Segoe UI', Arial, sans-serif; color: #1a1a1a; margin: 0; padding: 20px; font-size: 10px; }
    h1 { font-size: 20px; margin: 0 0 8px; color: #1e3a8a; }
    h2 { font-size: 13px; margin: 18px 0 6px; color: #1f2937; border-bottom: 1px solid #e5e7eb; padding-bottom: 3px; }
    h2 .count { display: inline-block; background: #3b82f6; color: #fff; border-radius: 999px; padding: 0 6px; font-size: 9px; margin-left: 6px; vertical-align: middle; }
    .cover { margin-bottom: 16px; padding: 12px; background: #f3f4f6; border-left: 4px solid #1e3a8a; border-radius: 4px; }
    .lead { font-size: 10px; color: #4b5563; margin: 0 0 8px; }
    .meta .kv, .grid .kv { font-size: 9px; }
    .kv .k { font-weight: 600; color: #6b7280; }
    .kv .v { color: #111827; }
    .grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 2px 12px; }
    table { width: 100%; border-collapse: collapse; font-size: 9px; margin-top: 4px; }
    th { background: #374151; color: #fff; padding: 4px 6px; text-align: left; font-weight: 600; }
    td { padding: 3px 6px; border-bottom: 1px solid #e5e7eb; }
    tr:nth-child(even) td { background: #f9fafb; }
    .empty { font-style: italic; color: #9ca3af; font-size: 9px; margin: 4px 0 8px; }
    .footer { margin-top: 24px; font-size: 8px; color: #9ca3af; text-align: center; border-top: 1px solid #e5e7eb; padding-top: 8px; }
</style>
</head>
<body>
    ${sections.join('\n')}
    <div class="footer">
        AgênciaPSI &middot; Relatório LGPD &middot; Gerado em ${htmlEscape(fmtDate(meta.generated_at))}
        &middot; O titular tem direito a requerer a correção de dados incompletos, inexatos ou desatualizados (Art. 18, III).
    </div>
</body>
</html>`;
}

export async function downloadLgpdPDF(payload, tenantName, filename) {
    const html = buildLgpdHTML(payload, tenantName);
    await htmlToPdfDownload(html, filename || `lgpd-export-${Date.now()}.pdf`);
}
