export const UNIDADES_MEDIDA = ['ud', 'g', 'kg', 'ml', 'l', 'gr', 'col'] as const
export type UnidadMedida = (typeof UNIDADES_MEDIDA)[number]

const UNIDADES: Record<string, { factor: number; familia: string }> = {
  g: { factor: 1, familia: 'masa' },
  gr: { factor: 1, familia: 'masa' },
  kg: { factor: 1000, familia: 'masa' },
  ml: { factor: 1, familia: 'volumen' },
  l: { factor: 1000, familia: 'volumen' },
  ud: { factor: 1, familia: 'unidad' },
  col: { factor: 1, familia: 'unidad' },
}

function normalizarUnidad(unidad: string): string {
  return unidad.toLowerCase().trim()
}

export function calcularCostePorUnidad(importeCompra: number, cantidadLote: number): number {
  if (cantidadLote <= 0) return 0
  return importeCompra / cantidadLote
}

export function convertirUnidad(
  cantidad: number,
  desde: string,
  hacia: string,
): number {
  const origen = normalizarUnidad(desde)
  const destino = normalizarUnidad(hacia)

  if (origen === destino) return cantidad

  const unidadOrigen = UNIDADES[origen]
  const unidadDestino = UNIDADES[destino]

  if (!unidadOrigen || !unidadDestino) {
    throw new Error(`No se puede convertir de ${desde} a ${hacia}`)
  }

  if (unidadOrigen.familia !== unidadDestino.familia) {
    throw new Error(`Unidades incompatibles: ${desde} y ${hacia}`)
  }

  return (cantidad * unidadOrigen.factor) / unidadDestino.factor
}

export function calcularCosteLinea(
  gasto: { coste_por_unidad: number; unidad_medida: string },
  cantidadUsada: number,
  unidadUsada: string,
): number {
  const cantidadBase = convertirUnidad(cantidadUsada, unidadUsada, gasto.unidad_medida)
  return cantidadBase * gasto.coste_por_unidad
}

export function redondearCoste(valor: number, decimales = 4): number {
  const factor = 10 ** decimales
  return Math.round(valor * factor) / factor
}
