# 数据获取适配器基类
from abc import ABC, abstractmethod
from typing import Dict, Optional, List
import pandas as pd


class BaseDataAdapter(ABC):
    """数据获取适配器基类
    
    所有数据获取适配器都需要实现这个接口，确保统一的方法调用方式。
    """
    
    @abstractmethod
    def connect(self) -> bool:
        """连接API
        
        Returns:
            bool: 连接是否成功
        """
        pass
    
    @abstractmethod
    def disconnect(self):
        """断开连接"""
        pass
    
    @abstractmethod
    def get_kline_data(self, symbol: str, duration: str, count: int = 200) -> Optional[pd.DataFrame]:
        """获取K线数据
        
        Args:
            symbol: 合约代码
            duration: 时间周期，如 '1m', '5m', '15m', '1h', '1d'
            count: 数据数量
            
        Returns:
            K线数据DataFrame，如果无法获取真实数据则返回None
        """
        pass
    
    @abstractmethod
    def get_tick_data(self, symbol: str, count: int = 1000) -> Optional[pd.DataFrame]:
        """获取Tick数据
        
        Args:
            symbol: 合约代码
            count: 数据数量
            
        Returns:
            Tick数据DataFrame，如果无法获取真实数据则返回None
        """
        pass
    
    @abstractmethod
    def get_contract_info(self, symbol: str) -> Optional[Dict]:
        """获取合约信息
        
        Args:
            symbol: 合约代码
            
        Returns:
            合约信息字典，如果无法获取真实数据则返回None
        """
        pass
    
    @abstractmethod
    def get_market_data(self, symbols: List[str]) -> Dict[str, Dict]:
        """批量获取市场数据
        
        Args:
            symbols: 合约代码列表
            
        Returns:
            市场数据字典，键为合约代码，值为市场数据
        """
        pass
    
    @abstractmethod
    def get_all_symbols(self) -> List[str]:
        """获取所有品种列表
        
        Returns:
            所有品种的合约代码列表
        """
        pass
