import * as XLSX from "xlsx";

import { formatTanggal, urlBukti, type Transaksi } from "@/lib/keuangan";

export type ModePeriode = "bulan" | "tahun" | "rentang";

export type OpsiExport = {
  mode: ModePeriode;
  bulan?: string; // YYYY-MM
  tahun?: string; // YYYY
  dari?: string; // YYYY-MM-DD
  sampai?: string; // YYYY-MM-DD
};

export function saringPeriode(items: Transaksi[], opsi: OpsiExport): Transaksi[] {
  return items.filter((t) => {
    if (opsi.mode === "bulan") return !!opsi.bulan && t.tanggal.startsWith(opsi.bulan);
    if (opsi.mode === "tahun") return !!opsi.tahun && t.tanggal.startsWith(opsi.tahun);
    if (!opsi.dari || !opsi.sampai) return false;
    return t.tanggal >= opsi.dari && t.tanggal <= opsi.sampai;
  });
}

export function namaBerkas(opsi: OpsiExport) {
  if (opsi.mode === "bulan") return `transaksi-${opsi.bulan}.xlsx`;
  if (opsi.mode === "tahun") return `transaksi-${opsi.tahun}.xlsx`;
  return `transaksi-${opsi.dari}-sd-${opsi.sampai}.xlsx`;
}

export async function exportTransaksiXlsx(items: Transaksi[], opsi: OpsiExport) {
  const baris = await Promise.all(
    items.map(async (t) => {
      const tautan = t.bukti_path ? await urlBukti(t.bukti_path) : null;
      return {
        Tanggal: formatTanggal(t.tanggal),
        Jenis: t.jenis === "pemasukan" ? "Pemasukan" : "Pengeluaran",
        Kategori: t.kategori,
        Nominal: Number(t.nominal),
        Sumber: t.sumber ?? "",
        Tujuan: t.tujuan ?? "",
        Catatan: t.catatan ?? "",
        "Nama Bukti": t.bukti_nama ?? "",
        "Tautan Bukti": tautan ?? "",
      };
    }),
  );

  const ws = XLSX.utils.json_to_sheet(baris, {
    header: [
      "Tanggal",
      "Jenis",
      "Kategori",
      "Nominal",
      "Sumber",
      "Tujuan",
      "Catatan",
      "Nama Bukti",
      "Tautan Bukti",
    ],
  });
  ws["!cols"] = [
    { wch: 20 },
    { wch: 14 },
    { wch: 16 },
    { wch: 16 },
    { wch: 18 },
    { wch: 18 },
    { wch: 30 },
    { wch: 24 },
    { wch: 45 },
  ];
  const wb = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(wb, ws, "Transaksi");
  XLSX.writeFile(wb, namaBerkas(opsi));
}
