from pydantic import BaseModel, Field, field_validator from typing import List, Dict, Optional, Any from datetime import datetime class FundMeta(BaseModel): fund_house: Optional[str] = None scheme_type: Optional[str] = None scheme_category: Optional[str] = None scheme_code: Optional[str] = None @field_validator('scheme_code', mode='before') @classmethod def convert_scheme_code_to_str(cls, v): if v is not None: return str(v) return v class NAVData(BaseModel): date: datetime nav: float class FundNAVResponse(BaseModel): meta: FundMeta data: List[NAVData] class MarketIndex(BaseModel): name: str symbol: str current_price: float change: float change_pct: float class MarketIndicesResponse(BaseModel): indices: List[MarketIndex] last_updated: datetime class FundAnalysisRequest(BaseModel): fund_names: List[str] investment_amount: float = Field(gt=0) start_date: datetime end_date: datetime class FundReturn(BaseModel): start_nav: float end_nav: float units: float final_value: float total_return: float investment_amount: float class FundAnalysisResult(BaseModel): fund_name: str category: str scheme_code: str fund_house: str returns_data: FundReturn nav_data: List[NAVData] fund_meta: FundMeta class FundAnalysisResponse(BaseModel): results: List[FundAnalysisResult] comparison_data: List[Dict[str, Any]]