import { BadRequestException, Injectable } from '@nestjs/common';
import { GestionesService } from 'src/cobranzas/gestiones.service';
import { PrismaService } from 'src/prisma/prisma.service';
import { VendedoresCobradoresService } from 'src/vendedores-cobradores/vendedores-cobradores.service';
import { CrearGestionMobileDto } from './dto/crear-gestion-mobile.dto';

/**
 * Wrapper mobile-only sobre GestionesService.
 *  - Aplica scope al cobrador vinculado al usuario logueado.
 *  - Soporta promesa enriquecida (Opción A): si llega `promesa_cuota_ids[]`,
 *    delega la creación de N promesas con prorrateo al service de dominio.
 */
@Injectable()
export class MobileGestionesService {
  constructor(
    private readonly gestiones: GestionesService,
    private readonly vendedores: VendedoresCobradoresService,
    private readonly prisma: PrismaService,
  ) {}

  async crear(empresaId: string, usuarioId: string, dto: CrearGestionMobileDto) {
    const cobrador = await this.vendedores.findCobradorVinculado(empresaId, usuarioId);
    if (!cobrador) {
      const diag = await this.vendedores.diagnosticarVinculoCobrador(empresaId, usuarioId);
      throw new BadRequestException(diag.mensaje ?? 'No podés registrar gestiones.');
    }

    return this.gestiones.create(
      {
        cliente_id: dto.cliente_id,
        factura_cab_id: dto.factura_cab_id,
        cobrador_id: cobrador.id,
        tipo_gestion: dto.tipo_gestion,
        resultado: dto.resultado,
        observacion: dto.observacion,
        proxima_accion: dto.proxima_accion,
        proxima_fecha: dto.proxima_fecha,
        geo_lat: dto.geo?.lat,
        geo_lng: dto.geo?.lng,
        // Promesa enriquecida (Opción A)
        promesa_fecha: dto.promesa_fecha,
        promesa_monto: dto.promesa_monto,
        promesa_cuota_ids: dto.promesa_cuota_ids,
        promesa_tipo_evidencia: dto.promesa_tipo_evidencia,
        promesa_pagador_tipo: dto.promesa_pagador_tipo,
        promesa_pagador_cliente_id: dto.promesa_pagador_cliente_id,
        promesa_notas: dto.promesa_notas,
      },
      empresaId,
      usuarioId,
    );
  }

  /**
   * Próximas acciones del cobrador (gestiones con `proxima_fecha >= hoy`).
   * Alimenta el badge "Mi agenda" del Home mobile.
   */
  async misProximas(empresaId: string, usuarioId: string) {
    const cobrador = await this.vendedores.findCobradorVinculado(empresaId, usuarioId);
    if (!cobrador) return [];
    return this.gestiones.getProximasAcciones(cobrador.id, empresaId);
  }
}
