"""
Shared data models for LLM execution.

These classes are the canonical definitions; they are re-exported by
markitect.prompts.execution.models for backward compatibility.
"""

from dataclasses import dataclass, field
from typing import Dict, Any


@dataclass
class RunConfig:
    """
    Configuration for prompt execution.

    Attributes:
        model_name: LLM model to use
        temperature: Model temperature (0.0-1.0)
        max_tokens: Maximum tokens to generate
        model_params: Additional model parameters
        max_depth: Maximum generation depth for nested runs
        skip_if_exists: Skip if identical InputBundleHash exists
        timeout_seconds: Execution timeout
    """
    model_name: str = "gpt-4"
    temperature: float = 0.7
    max_tokens: int = 2000
    model_params: Dict[str, Any] = field(default_factory=dict)
    max_depth: int = 3
    skip_if_exists: bool = True
    timeout_seconds: int = 300

    def to_dict(self) -> Dict[str, Any]:
        """Convert to dictionary."""
        return {
            "model_name": self.model_name,
            "temperature": self.temperature,
            "max_tokens": self.max_tokens,
            "model_params": self.model_params,
            "max_depth": self.max_depth,
            "skip_if_exists": self.skip_if_exists,
            "timeout_seconds": self.timeout_seconds,
        }

    @classmethod
    def from_dict(cls, data: Dict[str, Any]) -> "RunConfig":
        """Create from dictionary."""
        return cls(
            model_name=data.get("model_name", "gpt-4"),
            temperature=data.get("temperature", 0.7),
            max_tokens=data.get("max_tokens", 2000),
            model_params=data.get("model_params", {}),
            max_depth=data.get("max_depth", 3),
            skip_if_exists=data.get("skip_if_exists", True),
            timeout_seconds=data.get("timeout_seconds", 300),
        )


@dataclass
class LLMResponse:
    """
    Response from LLM execution.

    Attributes:
        content: Generated content
        model: Model used
        usage: Token usage statistics
        finish_reason: Why generation stopped
        metadata: Additional response metadata
    """
    content: str
    model: str
    usage: Dict[str, int] = field(default_factory=dict)
    finish_reason: str = "stop"
    metadata: Dict[str, Any] = field(default_factory=dict)

    def to_dict(self) -> Dict[str, Any]:
        """Convert to dictionary."""
        return {
            "content": self.content,
            "model": self.model,
            "usage": self.usage,
            "finish_reason": self.finish_reason,
            "metadata": self.metadata,
        }
