'use client';

import ExcelJS from 'exceljs';
import { formatDate } from '@/lib/helper';
import { DebtSupplier } from '@/types/api/report/debt-supplier';

interface DebtSupplierExportExcelParams {
  data: DebtSupplier[];
}

export const generateDebtSupplierExcel = async (
  params: DebtSupplierExportExcelParams
): Promise<void> => {
  if (!params.data || params.data.length === 0) {
    return;
  }

  const workbook = new ExcelJS.Workbook();

  const columns = [
    { header: 'No', key: 'no', width: 5 },
    { header: 'Nomor PR', key: 'prNumber', width: 14 },
    { header: 'Nomor PO', key: 'poNumber', width: 14 },
    { header: 'Tanggal Terima/Bayar', key: 'receivedDate', width: 20 },
    { header: 'Tanggal PO', key: 'poDate', width: 10 },
    { header: 'Aging (Hari)', key: 'aging', width: 10 },
    { header: 'Area', key: 'area', width: 15 },
    { header: 'Gudang', key: 'warehouse', width: 15 },
    { header: 'Jatuh Tempo', key: 'dueDate', width: 12 },
    { header: 'Status Jatuh Tempo', key: 'dueStatus', width: 20 },
    { header: 'Nominal Pembelian (Rp)', key: 'totalPrice', width: 20 },
    { header: 'Pembayaran (Rp)', key: 'paymentPrice', width: 15 },
    { header: 'Sisa Saldo Hutang (Rp)', key: 'balance', width: 20 },
    { header: 'Status', key: 'status', width: 12 },
    { header: 'Nomor Perjalanan', key: 'travelNumber', width: 15 },
  ];

  for (const supplierReport of params.data) {
    const supplierData = supplierReport.rows;
    const supplierName = supplierReport.supplier.name || 'Unknown Supplier';

    const worksheet = workbook.addWorksheet(supplierName.substring(0, 31));
    worksheet.columns = columns;

    // Add initial balance row
    const initialRow = worksheet.addRow({
      no: '',
      prNumber: '',
      poNumber: '',
      receivedDate: '',
      poDate: '',
      aging: '',
      area: '',
      warehouse: '',
      dueDate: '',
      dueStatus: '',
      totalPrice: '',
      paymentPrice: '',
      balance: supplierReport.initial_balance || 0,
      status: '',
      travelNumber: '',
    });

    // Apply red color if initial balance is negative
    const initialBalanceCell = initialRow.getCell('balance');
    if (
      typeof supplierReport.initial_balance === 'number' &&
      supplierReport.initial_balance < 0
    ) {
      initialBalanceCell.font = { color: { argb: 'FFFF0000' } };
    }

    // Add data rows
    supplierData.forEach((item, index) => {
      const row = worksheet.addRow({
        no: index + 1,
        prNumber: item.pr_number || '',
        poNumber: item.po_number || '',
        receivedDate: item.received_date
          ? item.received_date != '-'
            ? formatDate(item.received_date, 'MM/DD/YYYY')
            : '-'
          : '-',
        poDate: item.po_date
          ? item.po_date != '-'
            ? formatDate(item.po_date, 'MM/DD/YYYY')
            : '-'
          : '-',
        aging: item.aging || 0,
        area: item.area?.name || '',
        warehouse: item.warehouse?.name || '',
        dueDate: item.due_date
          ? item.due_date != '-'
            ? formatDate(item.due_date, 'MM/DD/YYYY')
            : '-'
          : '-',
        dueStatus: item.due_status || '',
        totalPrice: item.total_price || 0,
        paymentPrice: item.payment_price || 0,
        balance: item.balance || 0,
        status: item.status || '',
        travelNumber: item.travel_number || '',
      });

      // Apply red color for negative values
      const totalPriceCell = row.getCell('totalPrice');
      if (typeof item.total_price === 'number' && item.total_price < 0) {
        totalPriceCell.font = { color: { argb: 'FFFF0000' } };
      }

      const paymentPriceCell = row.getCell('paymentPrice');
      if (typeof item.payment_price === 'number' && item.payment_price < 0) {
        paymentPriceCell.font = { color: { argb: 'FFFF0000' } };
      }

      const balanceCell = row.getCell('balance');
      if (typeof item.balance === 'number' && item.balance < 0) {
        balanceCell.font = { color: { argb: 'FFFF0000' } };
      }
    });

    // Add total row
    if (supplierReport.total) {
      const totalRow = worksheet.addRow({
        no: 'Total',
        prNumber: '',
        poNumber: '',
        receivedDate: '',
        poDate: '',
        aging: supplierReport.total.aging || 0,
        area: '',
        warehouse: '',
        dueDate: '',
        dueStatus: '',
        totalPrice: supplierReport.total.total_price || 0,
        paymentPrice: supplierReport.total.payment_price || 0,
        balance: supplierReport.total.debt_price || 0,
        status: '',
        travelNumber: '',
      });

      // Apply red color for negative totals
      const totalPriceCell = totalRow.getCell('totalPrice');
      if (
        typeof supplierReport.total.total_price === 'number' &&
        supplierReport.total.total_price < 0
      ) {
        totalPriceCell.font = { color: { argb: 'FFFF0000' } };
      }

      const paymentPriceCell = totalRow.getCell('paymentPrice');
      if (
        typeof supplierReport.total.payment_price === 'number' &&
        supplierReport.total.payment_price < 0
      ) {
        paymentPriceCell.font = { color: { argb: 'FFFF0000' } };
      }

      const balanceCell = totalRow.getCell('balance');
      if (
        typeof supplierReport.total.debt_price === 'number' &&
        supplierReport.total.debt_price < 0
      ) {
        balanceCell.font = { color: { argb: 'FFFF0000' } };
      }
    }
  }

  const filename = `laporan-hutang-supplier-${formatDate(new Date(), 'YYYY-MM-DD-HHmm')}.xlsx`;

  const buffer = await workbook.xlsx.writeBuffer();
  const blob = new Blob([buffer], {
    type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  });
  const url = window.URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.href = url;
  link.download = filename;
  link.click();
  window.URL.revokeObjectURL(url);
};
