# -*- coding: utf-8 -*-
"""Contraste del modelo contra las 5 recetas probadas del obrador."""
import math
from afinador import F, AZUCAR

def dias(S0, arr, T, vel, progresoObj, vol=3.0):
    fTemp = F['q10']**((T-F['tempRef'])/10)
    fS0   = (S0/F['carbTotal'][2])**F['expS0']
    fArr  = (F['arrancador'][2]/arr)**F['expArr']
    d = (F['diasRef']*(progresoObj/0.6)*fS0*fArr)/(fTemp*vel)
    if T < 18: d *= 1+(18-T)*0.15
    return d + (vol/100)*(F['horasPor100L']/24)

def progreso_implicito(S0, arr, T, vel, dias_obs, vol=3.0):
    """Invierte la cinética: qué punto de corte implica el tiempo observado."""
    d = dias_obs - (vol/100)*(F['horasPor100L']/24)
    fTemp = F['q10']**((T-F['tempRef'])/10)
    fS0   = (S0/F['carbTotal'][2])**F['expS0']
    fArr  = (F['arrancador'][2]/arr)**F['expArr']
    if T < 18: d /= 1+(18-T)*0.15
    return d*0.6*fTemp*vel/(F['diasRef']*fS0*fArr)

R = [
 # nombre,            azúcar, starter, temp,  días obs,     perfil declarado
 ("White Bloom",       65,   12,  23.0, (6,8),   "acidez suave, delicada"),
 ("Summer Sencha",     70,   10,  24.0, (5,7),   "fácil de beber, comercial"),
 ("Black Roots",       75,   15,  24.5, (8,10),  "seco, estructurado, vinícola"),
 ("Forest Lab",        68,   15,  23.0, (9,12),  "seco, complejo, larga"),
 ("Ocean Coconut",     62.5, 12,  23.0, (5,6),   "refrescante, 1F corta"),
 # La sexta se produjo DESPUÉS de cerrar el contraste: la única que el modelo no vio.
 ("Suave rápida",      40,   20,  24.0, (6,6),   "amable, acidez media, lista para 2F"),
]

for etiqueta, vel in (("azúcar moreno · golden light (vel 0.92)", 0.92),):
    print(f"\n{'='*78}\nPUNTO DE CORTE IMPLÍCITO — {etiqueta}\n{'='*78}")
    print(f"{'receta':<16}{'S0':>6}{'arr%':>6}{'°C':>6}{'días obs':>11}"
          f"{'progreso implícito':>21}{'':>3}perfil")
    filas = []
    for n, az, arr, T, (d0,d1), perfil in R:
        S0 = az*0.97  # moreno: carbPorG 0.97
        p0 = progreso_implicito(S0, arr, T, vel, d0)
        p1 = progreso_implicito(S0, arr, T, vel, d1)
        filas.append((n, p0, p1, perfil))
        print(f"{n:<16}{S0:>6.0f}{arr:>6}{T:>6.1f}{f'{d0}–{d1}':>11}"
              f"{f'{p0:.2f} – {p1:.2f}':>21}   {perfil}")
    print(f"\n  rango del modelo: {F['progreso'][0]:.2f} – {F['progreso'][1]:.2f}")
    fuera = [n for n,p0,p1,_ in filas if p1 > F['progreso'][1] or p0 < F['progreso'][0]]
    print(f"  fuera de rango: {fuera if fuera else 'ninguna'}")
    print("\n  ORDEN por progreso implícito (medio) vs. perfil declarado:")
    orden = sorted(filas, key=lambda f: (f[1]+f[2])/2)
    for n,p0,p1,perfil in orden:
        print(f"    {(p0+p1)/2:.2f}  {n:<16} {perfil}")

    # Ácido y pH: el progreso es una FRACCIÓN, no un sabor. Consumir el 71% de 40 g/L
    # deja poco ácido; consumir el 63% de 94 deja mucho. Ordenar por ácido lo prueba.
    print("\n  ORDEN por ÁCIDO resultante (progreso × S0, no solo progreso):")
    print(f"    {'ácido g/L':>10}{'pH':>7}   receta            perfil")
    fa = 0.12  # factorAcido de la ficha
    acidfilas = []
    for n, az, arr, T, (d0,d1), perfil in R:
        S0 = az*0.97
        pm = (progreso_implicito(S0,arr,T,vel,d0) + progreso_implicito(S0,arr,T,vel,d1))/2
        acido = S0*pm*fa
        pH = min(4.9, max(2.4, 3.9 - 0.55*math.log(acido/2.5)))
        acidfilas.append((acido, pH, n, perfil))
    for acido, pH, n, perfil in sorted(acidfilas):
        print(f"    {acido:>10.2f}{pH:>7.2f}   {n:<16}  {perfil}")
