"""Deterministic scoring, same formula for every app (Amy-style weights)."""
W = {'cal': 0.40, 'protein': 0.25, 'carbs': 0.20, 'fat': 0.15}
FLOOR = {'cal': 10, 'protein': 2, 'carbs': 2, 'fat': 2}  # avoids divide-by-near-zero on foods with ~0 of a macro
PASS = {'simple': 80, 'exact': 80, 'restaurant': 80, 'homemade': 70, 'vague': 70}

def errors(est: dict, ref: dict) -> dict:
    return {k: min(1.0, abs(est[k] - ref[k]) / max(ref[k], FLOOR[k])) for k in W}

def score(est: dict, ref: dict) -> int:
    e = errors(est, ref)
    return max(0, min(100, round(100 * (1 - sum(W[k] * e[k] for k in W)))))
