"""Given token counts: no tokenizer, model request or provider-specific limit."""
import json


def remaining(context, output_limit, output, reserve, components):
    values = [context, output_limit, output, reserve, *components.values()]
    if any(type(v) is not int or v < 0 for v in values):
        raise ValueError("counts must be non-negative integers")
    if output > output_limit:
        raise ValueError("output limit exceeded")
    return context - sum(components.values()) - output - reserve


def demo():
    components = dict(instructions=2000, history=10000, tools=3000, evidence=8000)
    before = remaining(32000, 8000, 6000, 1000, components)
    after = remaining(32000, 8000, 6000, 1000, {**components, "result": 4000})
    assert before == 2000 and after == -2000
    return dict(input_tokens=sum(components.values()), current_room=before,
                next_turn_room=after, next_turn_fits=after >= 0)


if __name__ == "__main__":
    print(json.dumps(demo(), sort_keys=True))
