/**
 * Datos del emisor que salen en un comprobante (recibo, ticket), resueltos con
 * el mismo criterio que la factura (KuDE del generador de PDF): lo propio de la
 * sucursal que lo emitió y, si no lo tiene cargado, lo de la empresa.
 */

type ConLogo = { logo?: string | null } | null | undefined;
type ConNombreFantasia = { nombre_fantasia?: string | null } | null | undefined;

/** Logo: el de la sucursal emisora; si no tiene, el de la empresa. */
export function logoEmisor(sucursal: ConLogo, empresa: ConLogo): string | null {
  return sucursal?.logo?.trim() || empresa?.logo?.trim() || null;
}

/**
 * Nombre comercial: el de la sucursal emisora; si no tiene, el de la empresa.
 * `null` = el comprobante muestra sólo la razón social. Cuando hay nombre
 * comercial, la plantilla lo pone arriba y la razón social (el dato fiscal) debajo.
 */
export function nombreFantasiaEmisor(sucursal: ConNombreFantasia, empresa: ConNombreFantasia): string | null {
  return sucursal?.nombre_fantasia?.trim() || empresa?.nombre_fantasia?.trim() || null;
}

type SucursalEmisor = { logo: string | null; nombre_fantasia: string | null };

/**
 * Sucursal emisora de un reporte que junta varios documentos (estado de cuenta,
 * historial crediticio): si todos son de una misma sucursal, esa; si mezclan
 * sucursales o no hay documentos, `null` y el encabezado queda con la empresa.
 *
 * Los documentos fiscales se atan a la sucursal por establecimiento (`dest`,
 * mismo eje que el alcance por sucursal); las compras, por `sucursal_id`.
 */
export async function sucursalUnicaDeDocumentos(
  prisma: { empresas_sucursales: { findMany: (args: any) => Promise<any[]> } },
  empresaId: string,
  documentos: { establecimientos?: Array<string | null | undefined>; sucursalIds?: Array<string | null | undefined> },
): Promise<SucursalEmisor | null> {
  const unicos = (valores?: Array<string | null | undefined>) => [...new Set((valores ?? []).filter((v): v is string => !!v))];
  const establecimientos = unicos(documentos.establecimientos);
  const sucursalIds = unicos(documentos.sucursalIds);
  if (establecimientos.length + sucursalIds.length !== 1) return null;

  const [sucursal] = await prisma.empresas_sucursales.findMany({
    where: {
      empresa_id: empresaId,
      ...(sucursalIds.length ? { id: { in: sucursalIds } } : { punto_establecimiento: { in: establecimientos } }),
    },
    select: { logo: true, nombre_fantasia: true },
    take: 1,
  });
  return sucursal ? { logo: sucursal.logo ?? null, nombre_fantasia: sucursal.nombre_fantasia ?? null } : null;
}
