import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service';
import { VendedoresCobradoresService } from 'src/vendedores-cobradores/vendedores-cobradores.service';
import { MobileClientesService } from '../clientes/mobile-clientes.service';

/** Reportes del cobrador para móvil (resumen del día + cartera vencida). */
@Injectable()
export class MobileReportesService {
  constructor(
    private readonly prisma: PrismaService,
    private readonly vendedores: VendedoresCobradoresService,
    private readonly clientes: MobileClientesService,
  ) {}

  /** Recaudado de hoy del cobrador logueado: total, desglose por medio, recibos y clientes únicos. */
  async resumenDia(empresaId: string, usuarioId: string, fecha?: string) {
    const cobrador = await this.vendedores.findCobradorVinculado(empresaId, usuarioId);

    const base = fecha ? new Date(fecha) : new Date();
    const inicio = new Date(base);
    inicio.setHours(0, 0, 0, 0);
    const fin = new Date(base);
    fin.setHours(23, 59, 59, 999);

    const recibos = await this.prisma.recibos_cobro.findMany({
      where: {
        empresa_id: empresaId,
        cobrador_id: cobrador?.id,
        estado: { not: 'anulado' },
        fecha_emision: { gte: inicio, lte: fin },
      },
      select: {
        cliente_id: true,
        monto_total: true,
        recibo_cobro_detalle: {
          select: {
            monto_pagado: true,
            medio_pago: { select: { codigo: true, descripcion: true } },
          },
        },
      },
    });

    const desglose: Record<string, number> = {};
    let totalRecaudado = 0;
    const clientes = new Set<string>();

    for (const r of recibos) {
      totalRecaudado += Number(r.monto_total || 0);
      clientes.add(r.cliente_id);
      for (const d of r.recibo_cobro_detalle) {
        const key = d.medio_pago?.descripcion ?? 'Otro';
        desglose[key] = (desglose[key] ?? 0) + Number(d.monto_pagado || 0);
      }
    }

    return {
      fecha: inicio.toISOString().split('T')[0],
      cobrador: cobrador ? { id: cobrador.id, nombre: `${cobrador.nombre} ${cobrador.apellido ?? ''}`.trim() } : null,
      total_recaudado: totalRecaudado,
      cantidad_recibos: recibos.length,
      clientes_unicos: clientes.size,
      desglose_por_forma_pago: desglose,
    };
  }

  /** Cartera vencida del cobrador (reusa la resolución de cartera de clientes). */
  carteraVencida(empresaId: string, usuarioId: string) {
    return this.clientes.listar(empresaId, usuarioId, { cartera: true, vencida: true });
  }
}
