from fastapi import APIRouter, Query, Depends, Path from typing import List, Optional from loguru import logger from models import AIAnalysis, KLineData, Stock, ApiResponse, DataSourceType from adapters import DataAdapterFactory router = APIRouter(prefix="/stock", tags=["个股分析"]) def get_data_source(source: str = Query(None)) -> DataSourceType: if source: try: return DataSourceType(source) except ValueError: pass return DataSourceType.EASTMONEY @router.get("/{code}", response_model=ApiResponse, summary="获取股票详情") async def get_stock_detail( code: str = Path(..., description="股票代码"), source: DataSourceType = Depends(get_data_source) ): try: adapter = DataAdapterFactory.get_adapter(source) data = await adapter.fetch_stock_detail(code) if data: return ApiResponse( success=True, data=data.model_dump(), message=f"数据来源: {adapter.name}", ) return ApiResponse(success=False, error="股票不存在") except Exception as e: logger.error(f"Failed to fetch stock detail: {e}") return ApiResponse(success=False, error=str(e)) @router.get("/{code}/kline", response_model=ApiResponse, summary="获取K线数据") async def get_kline_data( code: str = Path(..., description="股票代码"), days: int = Query(30, ge=5, le=120, description="天数"), source: DataSourceType = Depends(get_data_source) ): try: adapter = DataAdapterFactory.get_adapter(source) data = await adapter.fetch_kline_data(code, days) return ApiResponse( success=True, data=[item.model_dump() for item in data], message=f"数据来源: {adapter.name}", ) except Exception as e: logger.error(f"Failed to fetch kline data: {e}") return ApiResponse(success=False, error=str(e)) @router.get("/{code}/analysis", response_model=ApiResponse, summary="获取AI分析") async def get_ai_analysis( code: str = Path(..., description="股票代码"), source: DataSourceType = Depends(get_data_source) ): try: adapter = DataAdapterFactory.get_adapter(source) data = await adapter.fetch_ai_analysis(code) return ApiResponse( success=True, data=data.model_dump(), message=f"数据来源: {adapter.name}", ) except Exception as e: logger.error(f"Failed to fetch AI analysis: {e}") return ApiResponse(success=False, error=str(e))