/**
 * Tipos y definiciones para el sistema de catación de café
 */

// ============================================================================
// INTENSIDADES
// ============================================================================

export interface IntensidadValor {
  /** Valor descriptivo: qué tan intensa es la característica (1-15) */
  descriptiva: number | null
  /** Valor afectivo: qué tan buena/mala es la característica (1-9) */
  afectiva: number | null
}

export interface Intensidades {
  fragancia: IntensidadValor
  aroma: IntensidadValor
  sabor: IntensidadValor
  saborResidual: IntensidadValor
  acidez: IntensidadValor
  dulzor: IntensidadValor
  sensacionBoca: IntensidadValor
  impresionGlobal: IntensidadValor
}

// ============================================================================
// FAMILIAS DE NOTAS
// ============================================================================

export type CategoriaNotaPrincipal =
  | 'Floral'
  | 'Afrutado'
  | 'Ácido/Fermentado'
  | 'Verde Vegetal'
  | 'Otro'
  | 'Tostado'
  | 'Nueces/Cacao'
  | 'Especias'
  | 'Dulce'

export interface FamiliasNotas {
  Floral: Record<string, never> // Sin subcategorías
  Afrutado: {
    Bayas: string[]
    'Frutas Deshidratadas': string[]
    Cítricos: string[]
  }
  'Ácido/Fermentado': {
    Ácido: string[]
    Fermentado: string[]
  }
  'Verde Vegetal': Record<string, never>
  Otro: {
    Químico: string[]
    'Humedad/Tierra': string[]
    Madera: string[]
  }
  Tostado: {
    Cereal: string[]
    Quemado: string[]
    Tabaco: string[]
  }
  'Nueces/Cacao': {
    Nueces: string[]
    Cacao: string[]
  }
  Especias: Record<string, never>
  Dulce: {
    Vainilla: string[]
    'Azúcar Morena': string[]
  }
}

export interface NotaSeleccionada {
  /** Categorías principales seleccionadas (múltiples) */
  categorias: CategoriaNotaPrincipal[]
  /** Subcategorías seleccionadas (múltiples, unión de subcategorías de categorías seleccionadas) */
  subcategorias: string[]
  /** Nota específica seleccionada o escrita libremente */
  notaEspecifica: string | null
}

// ============================================================================
// DEFECTOS Y CARACTERÍSTICAS
// ============================================================================

export type TipoDefecto = 'Mohoso' | 'Fenólico' | 'Papa' | null

export type SensacionBoca =
  | 'Áspero'
  | 'Aceitoso'
  | 'Metálico'
  | 'Deja seca la boca'
  | 'Suave'

export type GustoPredominante = 'Salado' | 'Amargo' | 'Ácido' | 'Dulce' | 'Umami'

// ============================================================================
// MUESTRA
// ============================================================================

export interface Muestra {
  /** ID único de la muestra */
  muestraId: number
  /** Nombre o código de la muestra */
  nombre: string
  /** Valores de intensidad para cada parámetro */
  intensidades: Intensidades
  /** Notas de fragancia y aroma */
  fraganciaAromaNotas: NotaSeleccionada
  /** Notas de sabor */
  saborNotas: NotaSeleccionada
  /** Tazas no uniformes (números 1-5) */
  tazasNoUniformes: number[]
  /** Tazas defectuosas (números 1-5) */
  tazasDefectuosas: number[]
  /** Tipo de defecto encontrado */
  defecto: TipoDefecto
  /** Sensación en la boca (selección única) */
  sensacionEnBoca: SensacionBoca | null
  /** Gustos predominantes (máximo 2, mínimo 1) */
  gustosPredominantes: GustoPredominante[]
  /** Notas adicionales en texto libre */
  otrasNotas: string
  /** Puntaje final (suma de valores afectivos) */
  puntajeFinal: number
}

// ============================================================================
// SESIÓN DE CATACIÓN
// ============================================================================

export interface SesionCatacion {
  /** ID único de la sesión */
  sessionId: string
  /** Fecha de la catación */
  fecha: string
  /** Nombre del catador */
  catador: string
  /** Cantidad de muestras en esta sesión */
  cantidadMuestras: number
  /** Listado de muestras */
  muestras: Muestra[]
  /** Timestamp de creación */
  creadoEn: number
  /** Timestamp de última modificación */
  modificadoEn: number
}

// ============================================================================
// HELPERS Y UTILIDADES
// ============================================================================

/**
 * Crea una muestra vacía con valores por defecto
 */
export function crearMuestraVacia(id: number): Muestra {
  return {
    muestraId: id,
    nombre: `Muestra ${id}`,
    intensidades: {
      fragancia: { descriptiva: null, afectiva: null },
      aroma: { descriptiva: null, afectiva: null },
      sabor: { descriptiva: null, afectiva: null },
      saborResidual: { descriptiva: null, afectiva: null },
      acidez: { descriptiva: null, afectiva: null },
      dulzor: { descriptiva: null, afectiva: null },
      sensacionBoca: { descriptiva: null, afectiva: null },
      impresionGlobal: { descriptiva: null, afectiva: null },
    },
    fraganciaAromaNotas: {
      categorias: [],
      subcategorias: [],
      notaEspecifica: null,
    },
    saborNotas: {
      categorias: [],
      subcategorias: [],
      notaEspecifica: null,
    },
    tazasNoUniformes: [],
    tazasDefectuosas: [],
    defecto: null,
    sensacionEnBoca: null,
    gustosPredominantes: [],
    otrasNotas: '',
    puntajeFinal: 0,
  }
}

/**
 * Calcula la sumatoria afectiva sumando todos los valores afectivos
 */
export function calcularSumatoriaAfectiva(muestra: Muestra): number {
  const { intensidades } = muestra
  let total = 0

  // Sumar todos los valores afectivos que no sean null
  Object.values(intensidades).forEach((intensidad) => {
    if (intensidad.afectiva !== null) {
      total += intensidad.afectiva
    }
  })

  return total
}

/**
 * Calcula el puntaje final (sumatoria afectiva) - alias para compatibilidad
 */
export function calcularPuntajeFinal(muestra: Muestra): number {
  return calcularSumatoriaAfectiva(muestra)
}

/**
 * Redondea un número al múltiplo de 0.25 más cercano
 */
export function redondearA025(valor: number): number {
  return Math.round(valor / 0.25) * 0.25
}

/**
 * Calcula el SCAA Score a partir de la muestra
 * Fórmula: S = 0.65625 × Σhᵢ + 52.75 - 2u - 4d
 * donde hᵢ = puntaje afectivo (1-9), u = tazas no uniformes, d = tazas defectuosas
 * El resultado se redondea al múltiplo de 0.25 más cercano
 */
export function calcularSCAA(muestra: Muestra): number {
  const sumatoriaAfectiva = calcularSumatoriaAfectiva(muestra)
  const u = muestra.tazasNoUniformes.length
  const d = muestra.tazasDefectuosas.length

  const scaaRaw = 0.65625 * sumatoriaAfectiva + 52.75 - 2 * u - 4 * d
  return redondearA025(scaaRaw)
}

/**
 * Convierte un SCAA Score a Sumatoria Afectiva (sin penalizaciones)
 * Fórmula inversa: Σhᵢ = (S - 52.75) / 0.65625
 */
export function scaaASumatoriaAfectiva(scaaScore: number): number {
  return (scaaScore - 52.75) / 0.65625
}

/**
 * Convierte Sumatoria Afectiva a SCAA Score (sin penalizaciones)
 * Fórmula: S = 0.65625 × Σhᵢ + 52.75
 * El resultado se redondea al múltiplo de 0.25 más cercano
 */
export function sumatoriaAfectivaASCAA(sumatoriaAfectiva: number): number {
  const scaaRaw = 0.65625 * sumatoriaAfectiva + 52.75
  return redondearA025(scaaRaw)
}

/**
 * Crea una sesión de catación vacía
 */
export function crearSesionVacia(
  catador: string,
  cantidadMuestras: number
): SesionCatacion {
  const sessionId = `session-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`
  const ahora = Date.now()
  const fecha = new Date().toISOString().split('T')[0] || '' // YYYY-MM-DD

  const muestras: Muestra[] = []
  for (let i = 1; i <= cantidadMuestras; i++) {
    muestras.push(crearMuestraVacia(i))
  }

  return {
    sessionId,
    fecha,
    catador,
    cantidadMuestras,
    muestras,
    creadoEn: ahora,
    modificadoEn: ahora,
  }
}

// ============================================================================
// CONSTANTES
// ============================================================================

/**
 * Estructura jerárquica completa de familias de notas
 */
export const FAMILIAS_NOTAS_ESTRUCTURA: FamiliasNotas = {
  Floral: {},
  Afrutado: {
    Bayas: [],
    'Frutas Deshidratadas': [],
    Cítricos: [],
  },
  'Ácido/Fermentado': {
    Ácido: [],
    Fermentado: [],
  },
  'Verde Vegetal': {},
  Otro: {
    Químico: [],
    'Humedad/Tierra': [],
    Madera: [],
  },
  Tostado: {
    Cereal: [],
    Quemado: [],
    Tabaco: [],
  },
  'Nueces/Cacao': {
    Nueces: [],
    Cacao: [],
  },
  Especias: {},
  Dulce: {
    Vainilla: [],
    'Azúcar Morena': [],
  },
}

/**
 * Lista de todas las sensaciones en boca disponibles
 */
export const SENSACIONES_BOCA: SensacionBoca[] = [
  'Áspero',
  'Aceitoso',
  'Metálico',
  'Deja seca la boca',
  'Suave',
]

/**
 * Lista de todos los gustos predominantes disponibles
 */
export const GUSTOS_PREDOMINANTES: GustoPredominante[] = [
  'Salado',
  'Amargo',
  'Ácido',
  'Dulce',
  'Umami',
]

/**
 * Lista de tipos de defectos disponibles
 */
export const TIPOS_DEFECTOS: TipoDefecto[] = ['Mohoso', 'Fenólico', 'Papa', null]
