"""Skill执行器"""
import time
from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional

from src.agent.registry import get_registry


@dataclass
class SkillResult:
    """Skill执行结果"""
    data: Any
    confidence: float
    sources: List[Dict]
    metadata: Dict
    execution_time_ms: int


@dataclass
class SkillContext:
    """Skill执行上下文"""
    user_id: str
    tenant_id: str
    trace_id: str
    conversation_id: Optional[str] = None
    permissions: List[str] = field(default_factory=list)


class SkillExecutor:
    """Skill执行器"""

    async def execute(
        self,
        skill: any,
        capability: str,
        params: dict,
        context: SkillContext
    ) -> SkillResult:
        """
        执行Skill

        Args:
            skill: Skill实例
            capability: 能力名称
            params: 执行参数
            context: 执行上下文

        Returns:
            Skill执行结果
        """
        start_time = time.time()

        try:
            # 执行Skill
            result = await skill.execute(capability, params, context)

            # 计算执行时间
            execution_time_ms = int((time.time() - start_time) * 1000)

            # 如果返回的是原始数据，包装成SkillResult
            if not isinstance(result, SkillResult):
                result = SkillResult(
                    data=result,
                    confidence=1.0,
                    sources=[],
                    metadata={},
                    execution_time_ms=execution_time_ms
                )
            else:
                result.execution_time_ms = execution_time_ms

            return result

        except Exception as e:
            # 计算执行时间（即使失败）
            execution_time_ms = int((time.time() - start_time) * 1000)
            raise SkillExecutionError(f"Skill execution failed: {str(e)}", execution_time_ms)


class SkillExecutionError(Exception):
    """Skill执行错误"""
    def __init__(self, message: str, execution_time_ms: int = 0):
        super().__init__(message)
        self.execution_time_ms = execution_time_ms
