from logitbias_parser import parse
from logitbias import OpAnd, eval, EscapeToZero


def json2logitbias(obj):
    res = []
    for k, v in obj.items():
        parsed_k = parse(k)
        if isinstance(v, dict):
            exprs = json2logitbias(v)
            res.extend((OpAnd(parsed_k, expr[0]), expr[1]) for expr in exprs)
        elif isinstance(v, (int, float)):
            res.append((parsed_k, v))
    return res


def logitbias_eval(expr, env):
    try:
        res = eval(expr[0], env)
    except (EscapeToZero, IndexError):
        return 0
    return expr[1] if res else 0


def logitbias_eval_all(exprs, env):
    return sum(logitbias_eval(expr, env) for expr in exprs)
