"""
数据层抽象接口（通用）

只提供数据获取抽象接口，具体实现在strategies/shared/data/
"""

from abc import ABC, abstractmethod
from typing import Dict, List, Optional, Any
import pandas as pd
from dataclasses import dataclass
from datetime import datetime


@dataclass
class OHLCVData:
    """
    OHLCV数据结构（通用）
    
    标准化的K线数据格式
    """
    code: str
    name: str = ""
    start_date: datetime = None
    end_date: datetime = None
    
    # OHLCV数据DataFrame
    data: pd.DataFrame = None
    
    @property
    def length(self) -> int:
        """数据长度"""
        return len(self.data) if self.data is not None else 0
    
    def validate(self) -> bool:
        """验证数据完整性"""
        if self.data is None or self.data.empty:
            return False
        
        required_cols = ['close']
        return all(col in self.data.columns for col in required_cols)
    
    def __repr__(self) -> str:
        return f"OHLCVData(code={self.code}, name={self.name}, length={self.length})"


class DataSource(ABC):
    """
    数据源抽象接口
    
    所有数据源必须实现fetch方法
    """
    
    name: str = "base"
    
    def __init__(self, **params):
        """初始化数据源参数"""
        self._params = params
    
    @abstractmethod
    def fetch(self, code: str, start: str, end: str) -> OHLCVData:
        """
        获取单个标的的OHLCV数据
        
        Args:
            code: 标的代码
            start: 开始日期 (YYYY-MM-DD)
            end: 结束日期 (YYYY-MM-DD)
            
        Returns:
            OHLCVData对象
        """
        pass
    
    @abstractmethod
    def fetch_batch(self, codes: List[str], start: str, end: str) -> Dict[str, OHLCVData]:
        """
        批量获取多个标的的OHLCV数据
        
        Args:
            codes: 标的代码列表
            start: 开始日期
            end: 结束日期
            
        Returns:
            {code: OHLCVData}字典
        """
        pass
    
    def get_supported_codes(self) -> List[str]:
        """获取支持的数据源代码列表"""
        return []
    
    def __repr__(self) -> str:
        return f"{self.__class__.__name__}(name={self.name})"


class DataCache(ABC):
    """
    数据缓存抽象接口（通用）
    
    支持本地缓存管理
    """
    
    @abstractmethod
    def get(self, code: str, start: str, end: str) -> Optional[OHLCVData]:
        """从缓存获取数据"""
        pass
    
    @abstractmethod
    def set(self, code: str, data: OHLCVData) -> None:
        """写入缓存"""
        pass
    
    @abstractmethod
    def is_fresh(self, code: str, max_age_days: int = 1) -> bool:
        """检查缓存是否新鲜"""
        pass
    
    @abstractmethod
    def clear(self, code: Optional[str] = None) -> None:
        """清空缓存"""
        pass


# 导出抽象接口
__all__ = ['OHLCVData', 'DataSource', 'DataCache']