import { Injectable } from '@nestjs/common';
import * as XLSX from 'xlsx';
import { CarteraDashboardService } from './dashboard.service';

@Injectable()
export class DashboardExportService {
  constructor(private readonly dashboard: CarteraDashboardService) {}

  async exportarExcel(empresa_id: string, rangoDias = 30): Promise<Buffer> {
    const data = await this.dashboard.getDashboard(empresa_id, rangoDias);
    const wb = XLSX.utils.book_new();

    // Hoja 1: Resumen de cartera
    const resumen = [
      { Indicador: 'Saldo total pendiente', Valor: data.cartera.saldo_total, Moneda: data.cartera.moneda },
      { Indicador: 'Saldo vencido', Valor: data.cartera.saldo_vencido, Moneda: data.cartera.moneda },
      { Indicador: 'Cuentas totales', Valor: data.cartera.cuentas_total, Moneda: '' },
      { Indicador: 'Cuentas con mora', Valor: data.cartera.cuentas_con_mora, Moneda: '' },
      { Indicador: 'Tasa de mora (%)', Valor: data.cartera.tasa_mora_pct, Moneda: '' },
      { Indicador: '', Valor: '', Moneda: '' },
      { Indicador: 'Fuente', Valor: data.fuente, Moneda: '' },
      { Indicador: 'Modo', Valor: data.modo, Moneda: '' },
      { Indicador: 'Rango analizado (días)', Valor: data.rango_dias, Moneda: '' },
    ];
    XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(resumen), 'Resumen');

    // Hoja 2: Promesas
    const promesas = [
      { Tipo: 'Pendientes', Cantidad: data.promesas.pendientes },
      { Tipo: 'Cumplidas', Cantidad: data.promesas.cumplidas },
      { Tipo: 'Incumplidas', Cantidad: data.promesas.incumplidas },
      { Tipo: 'Total', Cantidad: data.promesas.total },
      { Tipo: 'Tasa cumplimiento (%)', Cantidad: data.promesas.tasa_cumplimiento },
    ];
    XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(promesas), 'Promesas');

    // Hoja 3: Gestiones por canal
    const porCanal = data.gestiones.por_canal.map((c) => ({
      Canal: c.canal,
      Cantidad: c.cantidad,
    }));
    XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(porCanal), 'Gestiones por canal');

    // Hoja 4: Gestiones por cobrador
    const porCobrador = data.gestiones.por_cobrador.map((c) => ({
      Cobrador: c.cobrador_nombre,
      Cantidad: c.cantidad,
    }));
    XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(porCobrador), 'Gestiones por cobrador');

    // Hoja 5: Tendencia diaria
    const porDia = data.gestiones.por_dia.map((d) => ({ Fecha: d.fecha, Gestiones: d.cantidad }));
    XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(porDia), 'Tendencia diaria');

    // Hoja 6: Top morosos
    const morosos = data.top_morosos.map((m, i) => ({
      Ranking: i + 1,
      Cliente: m.cliente_nombre,
      'Saldo pendiente': m.saldo_pendiente,
      Moneda: m.moneda,
      'Días mora': m.dias_mora,
    }));
    XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(morosos), 'Top morosos');

    return XLSX.write(wb, { type: 'buffer', bookType: 'xlsx' }) as Buffer;
  }
}
