from __future__ import annotations

import json
from copy import deepcopy
from pathlib import Path

import pytest
from pydantic import JsonValue, TypeAdapter, ValidationError

import checkin_cli
import checkin_cli.customer_admin as customer_admin_module
from checkin_cli.customer_coaching import RegistryDocument
from tests.multi_customer_testkit import admission_policy
from tests.test_customer_coaching_domain import _registry_payload

_CUSTOMERS = TypeAdapter(list[dict[str, JsonValue]])


def test_registry_accepts_two_enabled_customers_with_bounded_policy(
    tmp_path: Path,
) -> None:
    payload = _registry_payload(second_enabled=True)
    payload["admission_policy"] = admission_policy(2)
    path = tmp_path / "registry.json"
    path.write_text(json.dumps(payload), encoding="utf-8")

    registry = checkin_cli.load_customer_registry(path, tmp_path)

    assert tuple(
        runtime.spec.customer_key
        for runtime in registry.customers
        if runtime.spec.enabled
    ) == ("client_001", "client_002")


def test_registry_rejects_enabled_customer_beyond_bounded_policy(
    tmp_path: Path,
) -> None:
    payload = _registry_payload(second_enabled=True)
    customers = _CUSTOMERS.validate_python(payload["customers"])
    third = deepcopy(customers[1])
    third["customer_key"] = "client_003"
    third["telegram"] = {
        "user_id": "customer-3",
        "chat_id": "customer-chat-3",
        "topic_id": "customer-topic-3",
    }
    customers.append(third)
    payload["customers"] = customers
    payload["admission_policy"] = admission_policy(2)
    path = tmp_path / "registry.json"
    path.write_text(json.dumps(payload), encoding="utf-8")

    with pytest.raises(
        (ValidationError, ValueError),
        match="customer capacity",
    ):
        checkin_cli.load_customer_registry(path, tmp_path)


def test_gate_d_accepts_selected_customer_within_bounded_registry() -> None:
    payload = _registry_payload(second_enabled=True)
    payload["admission_policy"] = admission_policy(2)
    document = RegistryDocument.model_validate(payload)

    assert customer_admin_module._gate_d_enabled_customer_isolated(
        document,
        "client_001",
    )
    assert customer_admin_module._gate_d_enabled_customer_isolated(
        document,
        "client_002",
    )


def test_initial_pilot_capacity_accepts_five_distinct_customers(
    tmp_path: Path,
) -> None:
    payload = _registry_payload(second_enabled=True)
    customers = _CUSTOMERS.validate_python(payload["customers"])
    template = customers[1]
    for number in range(3, 6):
        customer = deepcopy(template)
        customer["customer_key"] = f"client_00{number}"
        customer["telegram"] = {
            "user_id": f"customer-{number}",
            "chat_id": f"customer-chat-{number}",
            "topic_id": f"customer-topic-{number}",
        }
        customers.append(customer)
    payload["customers"] = customers
    payload["admission_policy"] = admission_policy(5)
    path = tmp_path / "registry.json"
    path.write_text(json.dumps(payload), encoding="utf-8")

    registry = checkin_cli.load_customer_registry(path, tmp_path)

    assert sum(runtime.spec.enabled for runtime in registry.customers) == 5
