import * as XLSX from "xlsx";

import { buildReportAuditMeta, buildReportCsvExport, buildReportExportMetadataRows } from "@/lib/reports/audit";
import type { ReportRequest, ReportResponse } from "@/lib/reports/contracts";
import { formatValueByType } from "@/lib/reports/utils";

/*
 * O arquivo de um relatório (planilha ou CSV), montado do mesmo jeito para a
 * rota /api/reports/export e para o assistente.
 */

export function normalizeReportFilename(value: string) {
  return value
    .normalize("NFD")
    .replace(/[̀-ͯ]/g, "")
    .replace(/[^a-zA-Z0-9_-]+/g, "-")
    .replace(/-+/g, "-")
    .replace(/^-|-$/g, "")
    .toLowerCase();
}

export function montarArquivoDoRelatorio(params: {
  report: ReportResponse;
  request: ReportRequest;
  format: "csv" | "xlsx";
  generatedBy: string;
  timezone: string;
}) {
  const { report, request, format, generatedBy, timezone } = params;
  const audit = buildReportAuditMeta({ report, generatedBy, sort: request.sort, timezone });
  const selectedColumns = report.columns.filter((column) =>
    request.visibleColumnIds?.length ? request.visibleColumnIds.includes(column.id) : true
  );
  const filename = normalizeReportFilename(`${report.title}-${new Date().toISOString().slice(0, 10)}`);

  if (format === "xlsx") {
    const rows = report.rows.map((row) =>
      Object.fromEntries(
        selectedColumns.map((column) => [column.label, formatValueByType(row[column.id] ?? null, column.type)])
      )
    );
    const metadataRows = buildReportExportMetadataRows(report, audit).map(([field, value]) => ({ Campo: field, Valor: value }));
    const summaryRows = report.kpis.map((item) => ({
      Indicador: item.label,
      Valor: formatValueByType(item.value, item.type === "currency" ? "currency" : item.type === "percent" ? "percent" : "number"),
    }));
    const metadataSheet = XLSX.utils.json_to_sheet(metadataRows);
    const summarySheet = XLSX.utils.json_to_sheet(summaryRows);
    const worksheet = XLSX.utils.json_to_sheet(rows);
    const workbook = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(workbook, metadataSheet, "Auditoria");
    XLSX.utils.book_append_sheet(workbook, summarySheet, "Indicadores");
    XLSX.utils.book_append_sheet(workbook, worksheet, "Relatorio");
    const buffer = XLSX.write(workbook, { type: "buffer", bookType: "xlsx" }) as Buffer;
    return {
      conteudo: buffer,
      tipo: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      nome: `${filename}.xlsx`,
      selectedColumns,
    };
  }

  const csv = buildReportCsvExport({ report, audit, visibleColumnIds: request.visibleColumnIds });
  return { conteudo: csv, tipo: "text/csv; charset=utf-8", nome: `${filename}.csv`, selectedColumns };
}
