import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service';

/**
 * Devuelve el payload de alertas que el app mobile muestra como banners en la
 * ficha del cliente antes de cobrar (mora legal, refinanciación activa,
 * promesas vigentes/incumplidas). Pensado para 1 request consolidado.
 */
@Injectable()
export class AlertasClienteService {
  constructor(private readonly prisma: PrismaService) {}

  async getAlertas(empresaId: string, clienteId: string) {
    const [moraActiva, refiActiva, promVig, promInc] = await Promise.all([
      this.prisma.cob_gestion_mora.findFirst({
        where: {
          cliente_id: clienteId,
          empresa_id: empresaId,
          deleted_at: null,
          estado_actual: { in: ['GESTION_INTERNA', 'INFORMCONF', 'DEMANDA'] },
        },
        select: {
          id: true,
          estado_actual: true,
          fecha_ingreso: true,
          observacion: true,
        },
        orderBy: { fecha_ingreso: 'desc' },
      }),
      this.prisma.cob_refinanciacion.findFirst({
        where: {
          cliente_id: clienteId,
          empresa_id: empresaId,
          estado: { in: ['EJECUTADA'] },
        },
        select: { id: true, created_at: true, cantidad_cuotas: true },
        orderBy: { created_at: 'desc' },
      }),
      this.prisma.promesas_pago.count({
        where: {
          cliente_id: clienteId,
          empresa_id: empresaId,
          estado: 'pendiente',
          fecha_prometida: { gte: new Date(new Date().toISOString().slice(0, 10)) },
        },
      }),
      this.prisma.promesas_pago.count({
        where: {
          cliente_id: clienteId,
          empresa_id: empresaId,
          estado: 'pendiente',
          fecha_prometida: { lt: new Date(new Date().toISOString().slice(0, 10)) },
        },
      }),
    ]);

    return {
      mora_avanzada: moraActiva
        ? {
            estado: moraActiva.estado_actual,
            estado_label: this.labelMora(moraActiva.estado_actual),
            fecha_ingreso: moraActiva.fecha_ingreso,
            observacion: moraActiva.observacion ?? null,
            // El cobrador debe coordinar con oficina antes de avanzar
            bloquea_cobro:
              moraActiva.estado_actual === 'INFORMCONF' || moraActiva.estado_actual === 'DEMANDA',
          }
        : null,
      refinanciacion_activa: refiActiva
        ? {
            id: refiActiva.id,
            fecha: refiActiva.created_at,
            cuotas_nuevas: refiActiva.cantidad_cuotas,
          }
        : null,
      promesas_vigentes: promVig,
      promesas_incumplidas: promInc,
    };
  }

  private labelMora(estado: string): string {
    switch (estado) {
      case 'GESTION_INTERNA':
        return 'Cliente con gestión interna abierta';
      case 'INFORMCONF':
        return 'Cliente informado a Informconf';
      case 'DEMANDA':
        return 'Cliente con demanda judicial';
      default:
        return estado;
    }
  }
}
