"""Assign improvement-discovery primary passes from the resolved roster."""
from __future__ import annotations

from collections.abc import Mapping


def assign_primary_lenses(
    worker_ids: list[str],
    priority_lenses: list[str],
) -> dict[str, str]:
    """Round-robin resolved worker instances over resolved priority lenses."""
    if not worker_ids:
        raise ValueError("worker IDs must not be empty")
    if not priority_lenses:
        raise ValueError("priority lenses must not be empty")
    if len(set(worker_ids)) != len(worker_ids):
        raise ValueError("worker IDs must be unique")
    return {
        worker_id: priority_lenses[index % len(priority_lenses)]
        for index, worker_id in enumerate(worker_ids)
    }


def validate_primary_lens_assignments(
    assignments: Mapping[str, str],
    worker_ids: list[str],
    priority_lenses: list[str],
) -> list[str]:
    """Require every selected analyser once at its roster-order lens."""
    errors: list[str] = []
    if not worker_ids:
        return ["resolved analyser worker IDs must not be empty"]
    if not priority_lenses:
        return ["resolved priority lenses must not be empty"]
    try:
        expected = assign_primary_lenses(worker_ids, priority_lenses)
    except ValueError as exc:
        return [str(exc)]
    if list(assignments) != worker_ids:
        errors.append(
            "assignment order must match resolved analyser worker order: "
            + ", ".join(worker_ids)
        )
    for worker_id in worker_ids:
        if worker_id not in assignments:
            errors.append(f"missing worker assignment: {worker_id}")
    for worker_id, lens in assignments.items():
        if worker_id not in expected:
            errors.append(f"extra worker assignment: {worker_id}")
            continue
        if lens not in priority_lenses:
            errors.append(
                f"{worker_id}: primary lens {lens!r} is outside resolved priority lenses"
            )
            continue
        if lens != expected[worker_id]:
            errors.append(
                f"{worker_id}: expected primary lens {expected[worker_id]!r}, "
                f"got {lens!r}"
            )
    return errors
