#!/usr/bin/env python3
"""
OpenBB 股票数据获取模块
"""

from datetime import datetime, timedelta
from typing import List, Dict, Any, Optional

def get_stock_data(symbol: str, days: int = 90) -> Optional[List[Dict[str, Any]]]:
    """
    获取指定股票在指定天数内的历史数据
    
    Args:
        symbol (str): 股票代码 (如 'AAPL')
        days (int): 时间窗口（天），默认90天
        
    Returns:
        List[Dict[str, Any]]: 股票历史数据列表，如果失败则返回None
    """
    try:
        # 计算开始日期
        end_date = datetime.now()
        start_date = end_date - timedelta(days=days)
        
        print(f"🔍 正在获取 {symbol} 近 {days} 天的数据...")
        print(f"   时间范围: {start_date.strftime('%Y-%m-%d')} 到 {end_date.strftime('%Y-%m-%d')}")
        
        # 使用OpenBB获取数据（延迟导入）
        try:
            from openbb import obb  # type: ignore
        except Exception as e:
            print(f"⚠️ OpenBB 未安装或导入失败: {e}")
            return None
        
        result = obb.equity.price.historical(
            symbol=symbol, 
            provider='yfinance',
            start_date=start_date.strftime('%Y-%m-%d'),
            end_date=end_date.strftime('%Y-%m-%d')
        )
        
        results = getattr(result, 'results', None)
        if results:
            print(f"✅ 成功获取 {len(results)} 条记录")
            return results
        else:
            print("❌ 未获取到数据")
            return None
            
    except Exception as e:
        print(f"❌ 获取数据时出错: {str(e)}")
        return None

def get_etf_data(symbol: str, days: int = 90) -> Optional[List[Dict[str, Any]]]:
    """
    获取指定ETF在指定天数内的历史数据
    
    Args:
        symbol (str): ETF代码 (如 'SPY')
        days (int): 时间窗口（天），默认90天
        
    Returns:
        List[Dict[str, Any]]: ETF历史数据列表，如果失败则返回None
    """
    try:
        # 计算开始日期
        end_date = datetime.now()
        start_date = end_date - timedelta(days=days)
        
        print(f"🔍 正在获取 {symbol} 近 {days} 天的数据...")
        print(f"   时间范围: {start_date.strftime('%Y-%m-%d')} 到 {end_date.strftime('%Y-%m-%d')}")
        
        # 使用OpenBB获取数据（延迟导入）
        try:
            from openbb import obb  # type: ignore
        except Exception as e:
            print(f"⚠️ OpenBB 未安装或导入失败: {e}")
            return None
        
        result = obb.etf.price.historical(
            symbol=symbol, 
            provider='yfinance',
            start_date=start_date.strftime('%Y-%m-%d'),
            end_date=end_date.strftime('%Y-%m-%d')
        )
        
        results = getattr(result, 'results', None)
        if results:
            print(f"✅ 成功获取 {len(results)} 条记录")
            return results
        else:
            print("❌ 未获取到数据")
            return None
            
    except Exception as e:
        print(f"❌ 获取数据时出错: {str(e)}")
        return None

def format_stock_data(data: List[Dict[str, Any]]) -> None:
    """
    格式化并打印股票数据
    
    Args:
        data (List[Dict[str, Any]]): 股票数据列表
    """
    if not data:
        print("😔 没有数据可显示")
        return
    
    print(f"\n📊 股票数据预览 (显示最近5条记录):")
    print("-" * 80)
    print(f"{'日期':<12} {'开盘':<10} {'最高':<10} {'最低':<10} {'收盘':<10} {'成交量':<15}")
    print("-" * 80)
    
    # 只显示最近5条记录
    for item in data[-5:]:
        print(f"{str(item.date):<12} {item.open:<10.2f} {item.high:<10.2f} {item.low:<10.2f} {item.close:<10.2f} {item.volume:<15,}")

def format_etf_data(data: List[Dict[str, Any]]) -> None:
    """
    格式化并打印ETF数据
    
    Args:
        data (List[Dict[str, Any]]): ETF数据列表
    """
    if not data:
        print("😔 没有数据可显示")
        return
    
    print(f"\n📊 ETF数据预览 (显示最近5条记录):")
    print("-" * 80)
    print(f"{'日期':<12} {'开盘':<10} {'最高':<10} {'最低':<10} {'收盘':<10} {'成交量':<15}")
    print("-" * 80)
    
    # 只显示最近5条记录
    for item in data[-5:]:
        print(f"{str(item.date):<12} {item.open:<10.2f} {item.high:<10.2f} {item.low:<10.2f} {item.close:<10.2f} {item.volume:<15,}")

def main():
    """主函数"""
    # 示例：获取AAPL股票和SPY ETF的数据
    symbols = [("AAPL", "stock"), ("SPY", "etf")]
    time_windows = [90, 720]
    
    for symbol, asset_type in symbols:
        for days in time_windows:
            print(f"\n{'='*60}")
            print(f"获取 {symbol} {days} 天数据")
            print(f"{'='*60}")
            
            if asset_type == "stock":
                data = get_stock_data(symbol, days)
                if data:
                    format_stock_data(data)
            else:
                data = get_etf_data(symbol, days)
                if data:
                    format_etf_data(data)

if __name__ == "__main__":
    main()