"""FIRE result adapter: existing immutable frame/event contract, flame only."""
from dataclasses import replace
from app.contracts.visualization import FrameResult, VisualizationCommand
from app.fire_config import FIRE_MODEL


def evaluate_result(engine, frame, observations, *, camera_id=None, scenario_revision=None):
    evaluation = engine.evaluate(frame, observations)
    if not evaluation.accepted:
        return None
    # Compact the public list and remap the representative in this exact Frame.
    # This is not a persistent ID; there is deliberately no Fire tracker.
    refs = {old: new for new, old in enumerate(evaluation.indices)}
    commands = tuple(VisualizationCommand(observations[i], 'flame_visible',
        color='#FF3030', visible=True, track_id=None,
        event_ids=(d.event_id,) if d.event_id else (), scenario=d)
        for i, d in zip(evaluation.indices, evaluation.decisions))
    events = tuple(replace(e, object_ref=str(refs[int(e.object_ref)])) for e in evaluation.events)
    return FrameResult(frame, commands, events, engine.config, scenario_revision,
                       provider_model=FIRE_MODEL, camera_id=camera_id)
