"""cmux pane dispatch planning and lead-adapter metadata override."""
from __future__ import annotations

from collections.abc import Mapping

from ... import dispatch_core
from ...domain.worker_exec import WorkerWriteCapability
from ...ports.worker_dispatch import (
    WorkerDispatchPlan,
    WorkerDispatchPort,
    WorkerDispatchRequest,
)
from .cli_wrapper import CliWrapperDispatchPort


CMUX_ADAPTER_NAME = "cmux"
CMUX_RELAY_CONTRACT = "lead/adapters/cmux.md"


class CmuxDispatchPort:
    def __init__(
        self,
        *,
        supported_worker_wrappers: Mapping[str, str] | None = None,
        unsupported_worker_label: str = "host",
        required_lead_runtime: str | None = None,
        cli_wrapper_assignments_only: bool = False,
        default_provider_by_worker_id: Mapping[str, str] | None = None,
        worker_write_capability: WorkerWriteCapability = WorkerWriteCapability(
            "none"
        ),
    ) -> None:
        self._backend_port = CliWrapperDispatchPort(
            supported_worker_wrappers=supported_worker_wrappers,
            unsupported_worker_label=unsupported_worker_label,
            required_lead_runtime=required_lead_runtime,
            default_backend=dispatch_core.BACKEND_CMUX_PANE,
            cli_wrapper_assignments_only=cli_wrapper_assignments_only,
            default_provider_by_worker_id=default_provider_by_worker_id,
            worker_write_capability=worker_write_capability,
        )

    def build_plan(self, request: WorkerDispatchRequest) -> WorkerDispatchPlan:
        backend_plan = self._backend_port.build_plan(request).backend_plan
        return WorkerDispatchPlan(
            mode="cmux-pane",
            request=request,
            backend_plan=backend_plan,
            adapter_name=CMUX_ADAPTER_NAME,
            dispatch_mode="team",
            relay_contract=CMUX_RELAY_CONTRACT,
        )

    def worker_write_capability(self) -> WorkerWriteCapability:
        return self._backend_port.worker_write_capability()


def dispatch_port_for_terminal_backend(
    terminal_backend: str,
    fallback_port: WorkerDispatchPort,
    *,
    supported_worker_wrappers: Mapping[str, str] | None = None,
    unsupported_worker_label: str = "host",
    required_lead_runtime: str | None = None,
    cli_wrapper_assignments_only: bool = False,
    default_provider_by_worker_id: Mapping[str, str] | None = None,
) -> WorkerDispatchPort:
    if terminal_backend != dispatch_core.BACKEND_CMUX_PANE:
        return fallback_port
    return CmuxDispatchPort(
        supported_worker_wrappers=supported_worker_wrappers,
        unsupported_worker_label=unsupported_worker_label,
        required_lead_runtime=required_lead_runtime,
        cli_wrapper_assignments_only=cli_wrapper_assignments_only,
        default_provider_by_worker_id=default_provider_by_worker_id,
    )
