from datetime import datetime from fastapi import APIRouter, Depends, Query from sqlalchemy.ext.asyncio import AsyncSession from pydantic import BaseModel from app.core.database import get_db from app.core.deps import get_current_user from app.models.user import User from app.services.weather_service import ( get_current_weather, get_forecast, get_weather_history, get_weather_impact, get_weather_config, update_weather_config, ) router = APIRouter(prefix="/weather", tags=["气象数据"]) class WeatherConfigUpdate(BaseModel): api_provider: str | None = None api_key: str | None = None location_lat: float | None = None location_lon: float | None = None fetch_interval_minutes: int | None = None is_enabled: bool | None = None @router.get("/current") async def current_weather( db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): """获取当前天气""" return await get_current_weather(db) @router.get("/forecast") async def weather_forecast( hours: int = Query(default=72, ge=1, le=168), db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): """获取72h天气预报""" return await get_forecast(db, hours) @router.get("/history") async def weather_history( start_date: str = Query(..., description="开始日期 e.g. 2026-03-01"), end_date: str = Query(..., description="结束日期 e.g. 2026-04-01"), db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): """获取历史天气数据""" start = datetime.fromisoformat(start_date) end = datetime.fromisoformat(end_date) return await get_weather_history(db, start, end) @router.get("/impact") async def weather_impact( days: int = Query(default=30, ge=1, le=365), db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): """天气对能源的影响分析""" return await get_weather_impact(db, days) @router.get("/config") async def get_config( db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): """获取气象API配置""" return await get_weather_config(db) @router.put("/config") async def set_config( data: WeatherConfigUpdate, db: AsyncSession = Depends(get_db), user: User = Depends(get_current_user), ): """更新气象API配置""" return await update_weather_config(db, data.model_dump(exclude_none=True))