import type { PrismaService } from 'src/prisma/prisma.service';

/**
 * La cotización se carga en dos pantallas que guardaban en tablas distintas:
 *  - Configuración → Monedas → Cotizaciones → `cotizacion_moneda` (compra/venta),
 *    que usa Facturación.
 *  - Contabilidad → Tipo de Cambio → `cont_tipo_cambio` (una tasa), que usan los
 *    asientos.
 * Cargar en una no servía para la otra: un cobro en dólares quedaba sin asiento
 * "por falta de tipo de cambio" aunque la cotización estaba cargada. Ahora cada
 * pantalla graba en las dos. La tasa contable es la de venta, el mismo criterio
 * que ya usaba la cotización vigente unificada (monedas.service).
 */

const soloFecha = (fecha: string | Date) =>
  typeof fecha === 'string' ? new Date(`${fecha.slice(0, 10)}T00:00:00Z`) : fecha;

/** Configuración → Contabilidad: la venta pasa a ser la tasa contable del día. */
export async function copiarATipoCambioContable(
  prisma: PrismaService,
  empresaId: string,
  monedaId: string,
  fecha: string | Date,
  venta: number,
): Promise<void> {
  if (!(venta > 0)) return;
  const moneda = await prisma.moneda.findUnique({ where: { id: monedaId }, select: { codigo: true } });
  const codigo = moneda?.codigo?.toUpperCase();
  if (!codigo || codigo === 'PYG') return;
  const f = soloFecha(fecha);
  await prisma.cont_tipo_cambio.upsert({
    where: { empresa_id_moneda_fecha: { empresa_id: empresaId, moneda: codigo, fecha: f } },
    update: { tasa: venta },
    create: { empresa_id: empresaId, moneda: codigo, fecha: f, tasa: venta },
  });
}

/**
 * Contabilidad → Configuración: la tasa queda como venta. Si ese día ya había
 * una compra cargada se conserva; si no, compra = venta = tasa. Solo si la
 * moneda está configurada para la empresa.
 */
export async function copiarACotizacionFacturacion(
  prisma: PrismaService,
  empresaId: string,
  codigo: string,
  fecha: string | Date,
  tasa: number,
  usuarioId?: string,
): Promise<void> {
  const cod = codigo?.toUpperCase();
  if (!cod || cod === 'PYG' || !(tasa > 0)) return;
  const moneda = await prisma.moneda.findFirst({ where: { codigo: cod }, select: { id: true } });
  if (!moneda) return;
  const configurada = await prisma.empresa_monedas.findUnique({
    where: { empresa_id_moneda_id: { empresa_id: empresaId, moneda_id: moneda.id } },
    select: { id: true },
  });
  if (!configurada) return;
  const f = soloFecha(fecha);
  await prisma.cotizacion_moneda.upsert({
    where: { empresa_id_moneda_id_fecha: { empresa_id: empresaId, moneda_id: moneda.id, fecha: f } },
    update: { cotizacion_venta: tasa, usuario_id: usuarioId ?? null },
    create: {
      empresa_id: empresaId,
      moneda_id: moneda.id,
      fecha: f,
      cotizacion_compra: tasa,
      cotizacion_venta: tasa,
      usuario_id: usuarioId ?? null,
    },
  });
}
