"""Run in the existing Analytics source-test environment; never starts a stream."""
import tempfile
import unittest
from unittest.mock import patch

from fastapi import HTTPException
from pydantic import ValidationError
from app.api.streams import StreamSpec, add_stream
from app.stream_manager import StreamManager
from app.stream_config_store import ConfigPersistenceError


class RegistrationIdentityTests(unittest.TestCase):
    def setUp(self):
        self.root = tempfile.TemporaryDirectory()
        self.addCleanup(self.root.cleanup)
        self.manager = StreamManager(self.root.name + "/base", self.root.name + "/overlay")

    def spec(self, stream="test01", source="source01"):
        return StreamSpec(stream_id=stream, server_id="test-server", source_id=source,
                          uri="rtsp://127.0.0.1:18554/sample01", store=False,
                          active_learning=False, autostart=False, scenarios="off",
                          inference_profile={"roles": ["det"], "det_model": "RFDETRMedium"})

    def test_http_projection_and_two_distinct_channels(self):
        with patch("app.api.streams._sm", return_value=(self.manager, ValueError)):
            for stream, source in (("test01", "source01"), ("test02", "source02")):
                add_stream(self.spec(stream, source), start=False)
                group = self.manager.get(stream)
                self.assertEqual(group.spec["source_id"], source)
                self.assertEqual(group.spec["server_id"], "test-server")
                self.assertEqual(group.state, "stopped")
            with self.assertRaises(HTTPException) as error:
                add_stream(self.spec("test03", "source01"), start=False)
            self.assertEqual(error.exception.status_code, 409)
            self.assertIsNone(self.manager.get("test03"))

    def test_pair_validation_and_save_failure(self):
        for value in ({"server_id": "server"}, {"source_id": "source"},
                      {"server_id": "server", "source_id": 1},
                      {"server_id": "server", "source_id": " "}):
            with self.assertRaises(ValidationError):
                StreamSpec(stream_id="test", **value)
        self.assertIsNone(StreamSpec(stream_id="legacy").source_id)
        with patch("app.api.streams._sm", return_value=(self.manager, ValueError)), patch.object(
                self.manager.config_store, "update", side_effect=ConfigPersistenceError()):
            with self.assertRaises(ConfigPersistenceError): add_stream(self.spec(), start=False)
        self.assertIsNone(self.manager.get("test01"))
