// src/contabilidad/services/mapeo-usable.ts

/**
 * Lo que hay que traer de `cont_mapeo_cuentas` para decidir si un mapeo sirve.
 * Usalo en el `select` junto con `mapeoUsable`.
 */
export const SELECT_MAPEO_USABLE = {
  concepto: true,
  modo: true,
  cuenta_id: true,
  cuenta: { select: { active: true, acepta_movimientos: true } },
} as const;

export interface MapeoParaUsable {
  modo?: string | null;
  cuenta_id?: string | null;
  cuenta?: { active?: boolean | null; acepta_movimientos?: boolean | null } | null;
}

/**
 * Un mapeo resuelve su concepto si suma a la cuenta principal o si apunta a una
 * cuenta activa que acepta movimientos. Uno a una cuenta desactivada o de
 * agrupación es, para el asiento, lo mismo que no tenerlo (`resolverConcepto`
 * lanza FaltaMapeoError CUENTA_INUTILIZABLE). Mismo criterio en alertas,
 * Conciliación y Salud contable: no dupliques esta regla.
 */
export function mapeoUsable(m: MapeoParaUsable | null | undefined): boolean {
  if (!m) return false;
  if (m.modo === 'SUMAR_A_PRINCIPAL') return true;
  return !!m.cuenta?.active && !!m.cuenta.acepta_movimientos;
}

/**
 * Una regla por dimensión resuelve su cuenta con el mismo criterio que el mapeo
 * (`mapeoUsable`) y, además, solo con una cuenta de la empresa o global: una de
 * otra empresa, para `resolverConcepto`, no existe.
 */
export function reglaUsable(
  r: MapeoParaUsable & { cuenta?: (MapeoParaUsable['cuenta'] & { empresa_id?: string | null }) | null },
  empresaId: string,
): boolean {
  const ajena = !!r.cuenta && r.cuenta.empresa_id != null && r.cuenta.empresa_id !== empresaId;
  return !ajena && mapeoUsable(r);
}
