"""Freeze Event scope independently from live union and later channel snapshots."""
from copy import deepcopy


def event_snapshot(snapshot, event):
    if snapshot is None or 'ruleId' not in event:
        return snapshot
    if (any(snapshot.get(k) != event.get(k) for k in ('serverId','runId','runGeneration'))
            or str(snapshot.get('cameraId')) != str(event.get('cameraId'))):
        return None
    context = event.get('ruleContext') or {}
    if context.get('ruleId') != event['ruleId'] or context.get('scenarioCode') != event.get('scenario'):
        return None
    area = context.get('area')
    if not area or area['roiId'] != event.get('roiId'):
        return None
    selected = deepcopy(snapshot)
    objects = []
    for original in selected.get('objects', []):
        matches = [r for r in original.get('scenarioResults', [])
                   if r.get('ruleId') == event['ruleId'] and r.get('roiId') == event['roiId']
                   and r.get('scenario') == event['scenario'] and r.get('visible') is True]
        if not matches:
            continue
        row = matches[0]
        original.update(visible=True, labelText=row['labelText'], color=row['color'],
                        scenarioResults=[row], eventIds=row.get('eventIds', []))
        objects.append(original)
    selected['objects'] = objects
    native = context.get('settings') or {}
    if event['scenario'] == 'FIRE':
        native = native.get('scenario') or {}
    selected['scenarioConfig'] = {event['scenario']: dict(roi=area['points'],
        roi_name=area['label'], debug_roi=native.get('debug_roi', True), outside=area['outside'])}
    selected['crowd'] = dict(regions=[r for r in snapshot.get('ruleRegions', [])
                                    if r.get('ruleId') == event['ruleId'] and r.get('roiId') == event['roiId']])
    return selected
