"""CLI-wrapper dispatch planning backed by the shared dispatch core."""
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, WorkerDispatchRequest


class CliWrapperDispatchPort:
    def __init__(
        self,
        *,
        supported_worker_wrappers: Mapping[str, str] | None = None,
        unsupported_worker_label: str = "host",
        required_lead_runtime: str | None = None,
        default_backend: str = dispatch_core.BACKEND_CLI_WRAPPER,
        cli_wrapper_assignments_only: bool = False,
        default_provider_by_worker_id: Mapping[str, str] | None = None,
        worker_write_capability: WorkerWriteCapability = WorkerWriteCapability(
            "none"
        ),
    ) -> None:
        self._supported_worker_wrappers = supported_worker_wrappers or {}
        self._unsupported_worker_label = unsupported_worker_label
        self._required_lead_runtime = required_lead_runtime
        self._default_backend = default_backend
        self._cli_wrapper_assignments_only = cli_wrapper_assignments_only
        self._default_provider_by_worker_id = dict(
            default_provider_by_worker_id or {}
        )
        self._worker_write_capability = worker_write_capability

    def build_plan(self, request: WorkerDispatchRequest) -> WorkerDispatchPlan:
        backend_plan = None
        if request.workspace_root is not None:
            backend_plan = dispatch_core.build_dispatch_plan(
                project_root=request.project_root,
                run_manifest_path=request.run_manifest,
                workspace_root=request.workspace_root,
                okstra_bin=request.okstra_bin,
                requested_workers=request.requested_workers,
                idle_timeout_seconds=request.idle_timeout_seconds,
                required_lead_runtime=self._required_lead_runtime,
                default_backend=self._default_backend,
                supported_worker_wrappers=self._supported_worker_wrappers,
                unsupported_worker_label=self._unsupported_worker_label,
                dispatch_kind=request.dispatch_kind,
                jobs_file=request.jobs_file,
                cli_wrapper_assignments_only=self._cli_wrapper_assignments_only,
                default_provider_by_worker_id=self._default_provider_by_worker_id,
            )
        return WorkerDispatchPlan(
            mode="cli-wrapper",
            request=request,
            backend_plan=backend_plan,
            dispatch_mode="render-only",
        )

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