import { Injectable } from '@nestjs/common';
import { ClientesService } from 'src/clientes/clientes.service';
import { CobrosService } from 'src/cobros/cobros.service';
import { VendedoresCobradoresService } from 'src/vendedores-cobradores/vendedores-cobradores.service';

/**
 * Cartera + búsqueda + estado de cuenta para móvil.
 * Reutiliza ClientesService.search, CobrosService.getHojaDeRuta / getEstadoCuentaCliente
 * y resuelve la cartera del cobrador vía VendedoresCobradoresService.findCobradorVinculado.
 */
@Injectable()
export class MobileClientesService {
  constructor(
    private readonly clientes: ClientesService,
    private readonly cobros: CobrosService,
    private readonly vendedores: VendedoresCobradoresService,
  ) {}

  /**
   * - `q` (>=2 chars): búsqueda libre en toda la empresa.
   * - sin `q`: cartera asignada del cobrador logueado (vencida si `vencida=true`).
   *   Si el usuario no está vinculado a un cobrador → `sin_cartera: true`.
   */
  async listar(
    empresaId: string,
    usuarioId: string,
    opts: { q?: string; cartera?: boolean; vencida?: boolean },
  ) {
    const q = opts.q?.trim();
    if (q && q.length >= 2) {
      const items = await this.clientes.search(q, empresaId);
      return { modo: 'busqueda' as const, sin_cartera: false, items };
    }

    const cobrador = await this.vendedores.findCobradorVinculado(empresaId, usuarioId);
    if (!cobrador) {
      return { modo: 'cartera' as const, sin_cartera: true, cobrador: null, items: [] };
    }

    const estado = opts.vencida ? 'vencido' : 'todos';
    const hoja = await this.cobros.getHojaDeRuta(empresaId, cobrador.id, estado);
    return {
      modo: 'cartera' as const,
      sin_cartera: false,
      cobrador: {
        id: cobrador.id,
        nombre: `${cobrador.nombre} ${cobrador.apellido ?? ''}`.trim(),
        codigo: cobrador.codigo,
      },
      items: hoja,
    };
  }

  estadoCuenta(empresaId: string, clienteId: string) {
    return this.cobros.getEstadoCuentaCliente(empresaId, clienteId);
  }
}
