import os
import unittest
from unittest.mock import patch
from app.provider_plan import plan
from app.event_capture import EventCapture
from app.crowd_config import CrowdConfig
from app.crowd_scenario import Crowd
from app.crowd_result import CrowdResultProcessor
from app.contracts.frames import FrameEnvelope
from tools.provider_process_compare import isolated_spec, configure_isolation


class CompareTest(unittest.TestCase):
    def test_same_providers_isolated_identity_and_no_events(self):
        original=dict(stream_id='original',server_id='server',source_id='3',camera_id=3,uri='unused',
            tracking={'enabled':True},fight={'enabled':True},fall={'enabled':True},
            fire={'enabled':True,'scenario':{'enabled':True}},crowd={'enabled':True},
            pose={'enabled':True,'show_joints':True},analysis_fps_target=10,
            store=False,active_learning=False,scenarios='off')
        a=isolated_spec(original,'a',('pose','fire','crowd'))
        b=[isolated_spec(original,p,(p,)) for p in ('pose','fire','crowd')]
        self.assertEqual(plan(a).keys, ('pose','fire','crowd'))
        self.assertEqual([plan(s).keys for s in b], [('pose',),('fire',),('crowd',)])
        self.assertEqual(len({s['source_id'] for s in [a]+b}),4)
        self.assertTrue(original['fight']['enabled'])
        self.assertEqual(original['camera_id'],3)
        for spec in [a]+b:
            f=FrameEnvelope(spec['server_id'],spec['source_id'],spec['stream_id'],'run',1,1,1,1,1280,720)
            processor=CrowdResultProcessor(Crowd(CrowdConfig(enabled=True)),camera_id=spec['camera_id'])
            result=processor.process(f,())
            self.assertEqual(result.snapshot()['cameraId'],spec['source_id'])
        with patch.dict(os.environ,{},clear=True):
            configure_isolation()
            for spec in [a]+b:
                self.assertIsNone(EventCapture.from_environment(spec))
                self.assertFalse(spec['tracking']['enabled'])
                self.assertFalse(spec['store'])
                self.assertFalse(spec['active_learning'])


if __name__=='__main__': unittest.main()
