"""ASV benchmarks for decision domain model operations.

Measures the performance of:
- Decision model construction (Pydantic validation)
- DecisionType enum access
- ContextSnapshot construction
- Decision serialization (model_dump / model_validate)
"""

from __future__ import annotations

import sys
from pathlib import Path

try:
    from cleveragents.domain.models.core.decision import (
        ArtifactRef,
        ContextSnapshot,
        Decision,
        DecisionType,
        ResourceRef,
    )
except ModuleNotFoundError:
    sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
    from cleveragents.domain.models.core.decision import (
        ArtifactRef,
        ContextSnapshot,
        Decision,
        DecisionType,
        ResourceRef,
    )

from ulid import ULID

_PLAN_ID = str(ULID())
_PARENT_ID = str(ULID())
_RESOURCE_ID = str(ULID())


class DecisionConstructionSuite:
    """Benchmark Decision model construction."""

    def time_minimal_root_decision(self) -> None:
        """Benchmark minimal prompt_definition creation."""
        Decision(
            plan_id=_PLAN_ID,
            sequence_number=0,
            decision_type=DecisionType.PROMPT_DEFINITION,
            question="What should we build?",
            chosen_option="A REST API",
        )

    def time_child_decision_with_confidence(self) -> None:
        """Benchmark child decision with confidence score."""
        Decision(
            plan_id=_PLAN_ID,
            parent_decision_id=_PARENT_ID,
            sequence_number=1,
            decision_type=DecisionType.STRATEGY_CHOICE,
            question="Which framework?",
            chosen_option="FastAPI",
            alternatives_considered=["Flask", "Django", "Starlette"],
            confidence_score=0.85,
        )

    def time_decision_with_snapshot(self) -> None:
        """Benchmark decision with full context snapshot."""
        Decision(
            plan_id=_PLAN_ID,
            parent_decision_id=_PARENT_ID,
            sequence_number=2,
            decision_type=DecisionType.IMPLEMENTATION_CHOICE,
            question="How to implement auth?",
            chosen_option="JWT tokens",
            context_snapshot=ContextSnapshot(
                hot_context_hash="sha256:bench123",
                hot_context_ref="store://snapshots/bench123",
                relevant_resources=[
                    ResourceRef(resource_id=_RESOURCE_ID, path="src/main.py"),
                    ResourceRef(resource_id=str(ULID())),
                ],
                actor_state_ref="checkpoint://actor/bench",
            ),
        )

    def time_correction_decision(self) -> None:
        """Benchmark correction decision creation."""
        Decision(
            plan_id=_PLAN_ID,
            parent_decision_id=_PARENT_ID,
            sequence_number=3,
            decision_type=DecisionType.STRATEGY_CHOICE,
            question="Which framework?",
            chosen_option="Django instead",
            is_correction=True,
            corrects_decision_id=str(ULID()),
            correction_reason="Changed requirements",
        )

    def time_decision_with_artifacts(self) -> None:
        """Benchmark decision with artifacts list."""
        Decision(
            plan_id=_PLAN_ID,
            parent_decision_id=_PARENT_ID,
            sequence_number=4,
            decision_type=DecisionType.TOOL_INVOCATION,
            question="Which tool?",
            chosen_option="code_editor",
            artifacts_produced=[
                ArtifactRef(artifact_path=f"src/file_{i}.py") for i in range(10)
            ],
        )


class DecisionSerializationSuite:
    """Benchmark Decision serialization round-trips."""

    def setup(self) -> None:
        self.decision = Decision(
            plan_id=_PLAN_ID,
            parent_decision_id=_PARENT_ID,
            sequence_number=5,
            decision_type=DecisionType.STRATEGY_CHOICE,
            question="Architecture choice?",
            chosen_option="Microservices",
            alternatives_considered=["Monolith", "Serverless"],
            confidence_score=0.78,
            context_snapshot=ContextSnapshot(
                hot_context_hash="sha256:serial",
                hot_context_ref="store://serial",
                relevant_resources=[
                    ResourceRef(resource_id=_RESOURCE_ID, path="src/app.py"),
                ],
                actor_state_ref="checkpoint://serial",
            ),
            artifacts_produced=[
                ArtifactRef(artifact_path="src/service.py"),
            ],
        )
        self.dump = self.decision.model_dump()

    def time_model_dump(self) -> None:
        """Benchmark model_dump serialization."""
        self.decision.model_dump()

    def time_model_dump_json(self) -> None:
        """Benchmark model_dump_json serialization."""
        self.decision.model_dump_json()

    def time_model_validate(self) -> None:
        """Benchmark model_validate deserialization."""
        Decision.model_validate(self.dump)

    def time_as_cli_dict(self) -> None:
        """Benchmark as_cli_dict rendering."""
        self.decision.as_cli_dict()


class ContextSnapshotSuite:
    """Benchmark ContextSnapshot construction."""

    def time_empty_snapshot(self) -> None:
        """Benchmark empty snapshot creation."""
        ContextSnapshot()

    def time_snapshot_with_resources(self) -> None:
        """Benchmark snapshot with multiple resource refs."""
        ContextSnapshot(
            hot_context_hash="sha256:bench",
            hot_context_ref="store://bench",
            relevant_resources=[
                ResourceRef(resource_id=str(ULID()), path=f"src/f{i}.py")
                for i in range(20)
            ],
            actor_state_ref="checkpoint://bench",
        )


class DecisionTypeEnumSuite:
    """Benchmark DecisionType enum operations."""

    def time_enum_access(self) -> None:
        """Benchmark accessing an enum member."""
        _ = DecisionType.PROMPT_DEFINITION

    def time_enum_from_value(self) -> None:
        """Benchmark creating enum from string value."""
        DecisionType("strategy_choice")

    def time_enum_iteration(self) -> None:
        """Benchmark iterating all enum members."""
        list(DecisionType)
