"""ASV benchmarks for unified CRP/core context model hierarchy.

Measures the construction throughput for core types that extend CRP base
types via Pydantic v2 inheritance, and the isinstance-check overhead.
"""

from __future__ import annotations

import importlib
import sys
from pathlib import Path

# Ensure the local *source* tree is importable even when ASV has an
# older build of the package installed.
_SRC = str(Path(__file__).resolve().parents[1] / "src")
if _SRC not in sys.path:
    sys.path.insert(0, _SRC)

# Force-reload the top-level package so Python picks up the source tree
# version instead of the potentially stale installed copy.
import cleveragents  # noqa: E402

importlib.reload(cleveragents)

from cleveragents.domain.models.acms.crp import (  # noqa: E402
    AssembledContext as CRPAssembledContext,
)
from cleveragents.domain.models.acms.crp import (  # noqa: E402
    ContextBudget as CRPContextBudget,
)
from cleveragents.domain.models.acms.crp import (  # noqa: E402
    ContextFragment as CRPContextFragment,
)
from cleveragents.domain.models.acms.crp import (  # noqa: E402
    FragmentProvenance as CRPFragmentProvenance,
)
from cleveragents.domain.models.core.context_fragment import (  # noqa: E402
    ContextBudget,
    ContextFragment,
    ContextPayload,
    FragmentProvenance,
)


class TimeUnifiedModelCreation:
    """Benchmark unified model construction throughput."""

    timeout = 60

    def setup(self) -> None:
        """Prepare reusable inputs."""
        self.provenance = FragmentProvenance(
            resource_uri="uko-py:module/bench",
            strategy="benchmark-strategy",
            resource_type="git-checkout",
        )

    def time_fragment_provenance(self) -> None:
        """Create core FragmentProvenance (inherits CRP)."""
        for _ in range(1000):
            FragmentProvenance(
                resource_uri="uko-py:module/bench",
                strategy="arce",
                resource_type="git-checkout",
            )

    def time_context_fragment(self) -> None:
        """Create core ContextFragment (inherits CRP)."""
        for _ in range(1000):
            ContextFragment(
                uko_node="project://bench",
                content="benchmark fragment",
                token_count=100,
                tier="hot",
                provenance=self.provenance,
            )

    def time_context_budget(self) -> None:
        """Create core ContextBudget (inherits CRP)."""
        for _ in range(1000):
            b = ContextBudget(max_tokens=8192, reserved_tokens=1024)
            _ = b.available_tokens

    def time_context_payload(self) -> None:
        """Create core ContextPayload (inherits CRP AssembledContext)."""
        for _ in range(1000):
            ContextPayload(plan_id="01JQBENCHPN0000000000000AA")


class TimeIsinstanceChecks:
    """Benchmark isinstance compatibility checks."""

    timeout = 60

    def setup(self) -> None:
        """Prepare instances."""
        prov = FragmentProvenance(resource_uri="uko-py:module/bench")
        self.provenance = prov
        self.fragment = ContextFragment(
            uko_node="project://bench",
            content="benchmark fragment",
            token_count=100,
            provenance=prov,
        )
        self.budget = ContextBudget(max_tokens=4096, reserved_tokens=512)
        self.payload = ContextPayload(
            plan_id="01JQBENCHPN0000000000000AA",
        )

    def time_isinstance_provenance(self) -> None:
        """isinstance check: FragmentProvenance against CRP base."""
        for _ in range(10000):
            isinstance(self.provenance, CRPFragmentProvenance)

    def time_isinstance_fragment(self) -> None:
        """isinstance check: ContextFragment against CRP base."""
        for _ in range(10000):
            isinstance(self.fragment, CRPContextFragment)

    def time_isinstance_budget(self) -> None:
        """isinstance check: ContextBudget against CRP base."""
        for _ in range(10000):
            isinstance(self.budget, CRPContextBudget)

    def time_isinstance_payload(self) -> None:
        """isinstance check: ContextPayload against CRP AssembledContext."""
        for _ in range(10000):
            isinstance(self.payload, CRPAssembledContext)
