"""
检测器基类
定义所有检测器必须实现的接口
"""

import abc
from typing import Dict, Any, Optional
import numpy as np


class BaseDetector(abc.ABC):
    """检测器基类，所有具体检测器必须继承此类"""
    
    def __init__(self, name: str, version: str, description: str = ""):
        """
        初始化检测器基本信息
        
        Args:
            name: 检测器名称
            version: 检测器版本
            description: 检测器描述
        """
        self.name = name
        self.version = version
        self.description = description
        self.initialized = False
        self.parameters = {}
    
    @abc.abstractmethod
    def initialize(self, config_params: Dict[str, Any] = None) -> bool:
        """
        初始化检测器，加载模型和配置
        
        Args:
            config_params: 配置参数字典，如果为None则使用默认配置
            
        Returns:
            bool: 初始化成功返回True，失败返回False
        """
        pass
    
    @abc.abstractmethod
    def detect(self, image: np.ndarray, params: Dict[str, Any] = None) -> Dict[str, Any]:
        """
        执行检测
        
        Args:
            image: 输入图像 (numpy array)
            params: 检测参数，如果为None则使用默认参数
            
        Returns:
            Dict: 检测结果，必须包含以下字段：
            {
                'success': bool,           # 检测是否成功
                'fold_result': int,        # 翻折状态码
                'errors': List[str],       # 错误信息
                'messages': List[str],     # 提示信息
                'statistics': Dict,        # 统计信息
                'details': Dict,           # 详细结果
                'draw_items': Dict,        # 绘图项（保持原有格式）
                'processed_image': np.ndarray  # 处理后的图像
            }
        """
        pass
    
    @abc.abstractmethod
    def get_default_parameters(self) -> Dict[str, Any]:
        """
        获取默认参数配置
        
        Returns:
            Dict: 默认参数字典
        """
        pass
    
    def get_available_functions(self) -> Dict[str, str]:
        """
        获取检测器可用的检测函数列表
        
        Returns:
            Dict[str, str]: 函数名称到描述的映射
        """
        # 默认只返回主检测函数
        return {
            'detect': '主检测函数'
        }
    
    def call_function(self, function_name: str, image: np.ndarray, params: Dict[str, Any] = None) -> Dict[str, Any]:
        """
        调用指定的检测函数
        
        Args:
            function_name: 要调用的函数名称
            image: 输入图像
            params: 检测参数
            
        Returns:
            Dict: 检测结果
        """
        if function_name == 'detect':
            return self.detect(image, params)
        else:
            raise ValueError(f"未知的函数名称: {function_name}")
    
    def warm_up(self) -> None:
        """
        预热检测器（可选方法）
        
        子类可以重写此方法来实现模型预热逻辑
        默认实现为空操作
        """
        pass
    
    def get_info(self) -> Dict[str, str]:
        """
        获取检测器信息
        
        Returns:
            Dict: 包含名称、版本、描述等信息的字典
        """
        return {
            'name': self.name,
            'version': self.version,
            'description': self.description,
            'initialized': self.initialized
        }
    
    def validate_parameters(self, params: Dict[str, Any]) -> bool:
        """
        验证参数有效性
        
        Args:
            params: 参数字典
            
        Returns:
            bool: 参数有效返回True
        """
        # 基础实现，子类可重写
        return isinstance(params, dict)
    
    def cleanup(self):
        """
        清理资源，释放内存等
        """
        self.initialized = False
        self.parameters = {}
    
    def __str__(self):
        return f"{self.name} v{self.version}"
    
    def __repr__(self):
        return f"<{self.__class__.__name__}({self.name}, {self.version})>"