"""
数据获取器抽象基类
"""

from abc import ABC, abstractmethod
from typing import Dict, List, Optional
import pandas as pd


class DataFetcher(ABC):
    """
    数据获取器抽象基类
    
    所有数据获取器必须实现必要方法
    """
    
    name: str = "base"
    
    def __init__(self, **params):
        """
        初始化数据获取器参数
        
        Args:
            **params: 数据源参数（如 api_url, ssh_config 等）
        """
        self._params = params
    
    @abstractmethod
    def fetch_indices(
        self,
        codes: List[str],
        start: str,
        end: str
    ) -> Dict[str, pd.DataFrame]:
        """
        获取指数 OHLCV 数据
        
        Args:
            codes: 指数代码列表
            start: 开始日期 (YYYY-MM-DD)
            end: 结束日期 (YYYY-MM-DD)
        
        Returns:
            {code: DataFrame} 字典
        """
        pass
    
    @abstractmethod
    def fetch_etf(
        self,
        codes: List[str],
        start: str,
        end: str
    ) -> Dict[str, pd.DataFrame]:
        """
        获取 ETF 数据（价格 + 净值）
        
        Args:
            codes: ETF 代码列表
            start: 开始日期
            end: 结束日期
        
        Returns:
            {code: DataFrame} 字典
        """
        pass
    
    @abstractmethod
    def get_trading_calendar(self, market: str = 'A') -> pd.Index:
        """
        获取交易日历
        
        Args:
            market: 市场代码（'A', 'US', 'HK' 等）
        
        Returns:
            交易日历 Index
        """
        pass
    
    def get_benchmark(self, code: str, start: str, end: str) -> pd.Series:
        """
        获取基准数据（可选）
        
        Args:
            code: 基准代码
            start: 开始日期
            end: 结束日期
        
        Returns:
            基准收盘价 Series
        """
        raise NotImplementedError("Optional method")
    
    def __repr__(self) -> str:
        params_str = ', '.join([f"{k}={v}" for k, v in self._params.items()])
        return f"{self.__class__.__name__}(name={self.name})"
