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

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

const SOURCE_LABELS = {
    audit_logs: 'Auditoria',
    document_access_logs: 'Acesso a documento',
    patient_status_history: 'Status paciente',
    notification_logs: 'Notificação',
    addon_transactions: 'Recurso extra'
};

const ENTITY_LABELS = {
    patients: 'Paciente',
    agenda_eventos: 'Evento de agenda',
    financial_records: 'Registro financeiro',
    documents: 'Documento',
    tenant_members: 'Membro do tenant',
    document: 'Documento',
    notification: 'Notificação',
    patient_status: 'Status do paciente',
    addon_transaction: 'Transação de recurso'
};

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',
            second: '2-digit'
        });
    } catch {
        return '';
    }
}

export function sourceLabel(src) {
    return SOURCE_LABELS[src] || src || '';
}

export function entityLabel(ent) {
    return ENTITY_LABELS[ent] || ent || '';
}

// ─── sanitização CSV (anti-injection) ────────────────────────────────────────

function csvCell(value) {
    if (value === null || value === undefined) return '';
    const s = String(value)
        .replace(/[\r\n]+/g, ' ')
        .replace(/"/g, '""')
        .trim();
    const safe = /^[=+\-@]/.test(s) ? ' ' + s : s;
    return `"${safe}"`;
}

function csvLine(cells) {
    return cells.map(csvCell).join(';');
}

export function buildAuditCSV(rows, summary, periodLabel, userDisplay) {
    const header = ['Data/Hora', 'Origem', 'Entidade', 'ID entidade', 'Ação', 'Descrição', 'Usuário'];
    const lines = [csvLine(header)];

    for (const r of rows) {
        lines.push(
            csvLine([
                fmtDate(r.occurred_at),
                sourceLabel(r.source),
                entityLabel(r.entity_type),
                r.entity_id ?? '',
                r.action ?? '',
                r.description ?? '',
                userDisplay(r.user_id)
            ])
        );
    }

    lines.push('');
    lines.push(csvLine(['Período', periodLabel]));
    lines.push(csvLine(['Total de registros', summary.totalRows]));
    lines.push(csvLine(['Usuários distintos', summary.distinctUsers]));

    return '\uFEFF' + lines.join('\r\n');
}

export function downloadAuditCSV(rows, summary, periodLabel, userDisplay, filename) {
    const csv = buildAuditCSV(rows, summary, periodLabel, userDisplay);
    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8' });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = filename || `auditoria-${Date.now()}.csv`;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
}

// ─── PDF ─────────────────────────────────────────────────────────────────────

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 buildAuditHTML(rows, summary, periodLabel, tenantName, userDisplay) {
    const tbody = rows
        .map(
            (r) => `
        <tr>
            <td>${htmlEscape(fmtDate(r.occurred_at))}</td>
            <td>${htmlEscape(sourceLabel(r.source))}</td>
            <td>${htmlEscape(entityLabel(r.entity_type))}</td>
            <td>${htmlEscape(r.description ?? '')}</td>
            <td>${htmlEscape(userDisplay(r.user_id))}</td>
        </tr>`
        )
        .join('');

    return `<!doctype html>
<html lang="pt-BR">
<head>
<meta charset="utf-8" />
<title>Relatório de Auditoria</title>
<style>
    * { box-sizing: border-box; }
    body { font-family: 'Segoe UI', Arial, sans-serif; color: #1a1a1a; margin: 0; padding: 24px; font-size: 10px; }
    h1 { font-size: 18px; margin: 0 0 4px 0; color: #2e3440; }
    .subtitle { color: #6b7280; font-size: 10px; margin-bottom: 16px; }
    .summary { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 14px; }
    .card { flex: 1 1 120px; border: 1px solid #e5e7eb; border-radius: 6px; padding: 6px 10px; background: #f9fafb; }
    .card .label { font-size: 8px; color: #6b7280; text-transform: uppercase; letter-spacing: 0.5px; }
    .card .value { font-size: 13px; font-weight: 600; color: #111827; margin-top: 2px; }
    table { width: 100%; border-collapse: collapse; font-size: 9px; }
    th { background: #374151; color: #fff; padding: 5px 7px; text-align: left; font-weight: 600; }
    td { padding: 4px 7px; border-bottom: 1px solid #e5e7eb; vertical-align: top; }
    tr:nth-child(even) td { background: #f9fafb; }
    .footer { margin-top: 14px; font-size: 8px; color: #9ca3af; text-align: center; }
</style>
</head>
<body>
    <h1>Relatório de Auditoria</h1>
    <div class="subtitle">
        ${htmlEscape(tenantName || '')} &middot; Período: <strong>${htmlEscape(periodLabel)}</strong>
        &middot; Gerado em ${htmlEscape(fmtDate(new Date().toISOString()))}
    </div>

    <div class="summary">
        <div class="card"><div class="label">Registros</div><div class="value">${summary.totalRows}</div></div>
        <div class="card"><div class="label">Usuários distintos</div><div class="value">${summary.distinctUsers}</div></div>
    </div>

    <table>
        <thead>
            <tr>
                <th>Data/Hora</th>
                <th>Origem</th>
                <th>Entidade</th>
                <th>Descrição</th>
                <th>Usuário</th>
            </tr>
        </thead>
        <tbody>
            ${tbody || '<tr><td colspan="5" style="text-align:center;color:#9ca3af;padding:16px;">Nenhum evento no período</td></tr>'}
        </tbody>
    </table>

    <div class="footer">AgênciaPSI &middot; Registro imutável de operações de tratamento (LGPD Art. 37)</div>
</body>
</html>`;
}

export async function downloadAuditPDF(rows, summary, periodLabel, tenantName, userDisplay, filename) {
    const html = buildAuditHTML(rows, summary, periodLabel, tenantName, userDisplay);
    await htmlToPdfDownload(html, filename || `auditoria-${Date.now()}.pdf`);
}

export const auditFormatters = {
    fmtDate,
    sourceLabel,
    entityLabel
};
