"""ROUTERSPLIT-01: Resource API와 Web Facade는 동일 Manager owner를 사용한다."""

from app.contracts.cameras import CameraConfigError, CameraStart, source_identity


class StreamApplicationService:
    def __init__(self, manager_provider=None, server_id=None, supported_scenarios=()):
        self._provider = manager_provider or _manager
        self.server_id = server_id
        self.supported_scenarios = frozenset(supported_scenarios)
        if not self.supported_scenarios <= {"INTRUSION", "LOITERING", "FALL", "FIGHT", "FIRE", "CROWD"}:
            raise ValueError("Invalid supported scenario codes.")

    @property
    def manager(self):
        return self._provider()

    def add(self, spec, start=False):
        return self.manager.add(spec, start=start)

    def get(self, stream_id):
        return self.manager.get(stream_id)

    def list(self, detail=False):
        return self.manager.list(detail=detail)

    def remove(self, stream_id):
        return self.manager.remove(stream_id)

    def start(self, stream_id):
        return self.manager.start(stream_id)

    def stop(self, stream_id):
        return self.manager.stop(stream_id)

    def restart(self, stream_id):
        return self.manager.restart(stream_id)

    def settings(self, stream_id):
        return self.manager.settings(stream_id)

    def patch_settings(self, stream_id, revision, changes):
        return self.manager.patch_settings(stream_id, revision, changes)

    def metadata_status(self, include_timeline=False):
        publisher = self.manager.metadata_publisher
        return dict(enabled=publisher is not None, metrics=publisher.metrics(include_timeline=include_timeline) if publisher else {})

    def start_camera(self, request: CameraStart):
        if not self.server_id:
            raise CameraConfigError("Server identity is not configured.")
        # SCENARIOAPPLY-01: 미지원은 명시 skip, 전부 skip이면 Detection-only다.
        effective, _ = self.scenario_selection(request)
        spec = request.runtime_spec(self.server_id)
        spec["scenarios"] = ",".join(x["code"].lower() for x in effective) or "off"
        return self.manager.apply_and_start(spec)

    def scenario_selection(self, request):
        effective, skipped = [], []
        for code, enabled in request.scenarios or ():
            if not enabled:
                continue
            target = effective if code in self.supported_scenarios else skipped
            target.append({"code": code, "message": "Enabled." if target is effective
                           else "Scenario is not supported by this AI configuration."})
        return effective, skipped

    def stop_camera(self, camera_id):
        source_id = source_identity(camera_id)
        return self.manager.stop(self.manager.camera_stream_id(source_id))


def _manager():
    from app.stream_manager import manager
    return manager


stream_service = StreamApplicationService()
