from pydantic import BaseModel, Field from typing import List, Dict, Optional, Any from datetime import datetime from enum import Enum class InvestmentType(str, Enum): LUMP_SUM = "Lump Sum" SIP_MONTHLY = "SIP (Monthly)" STP = "STP" class PortfolioHolding(BaseModel): scheme_code: str category: str fund_house: str invested_amount: float = Field(gt=0) current_value: float = Field(gt=0) units: float = Field(gt=0) current_nav: float = Field(gt=0) investment_type: InvestmentType nav_data: List[Any] = [] class Portfolio(BaseModel): holdings: Dict[str, PortfolioHolding] = {} class PortfolioMetrics(BaseModel): total_value: float total_invested: float total_gains: float category_allocation: Dict[str, float] class PortfolioTemplate(str, Enum): CONSERVATIVE = "Conservative" BALANCED = "Balanced" AGGRESSIVE = "Aggressive" CUSTOM_SAMPLE = "Custom Sample" class RebalanceAction(BaseModel): category: str current_pct: float target_pct: float difference: float amount_change: float action: str # "INCREASE" or "DECREASE" class RebalanceAnalysis(BaseModel): actions: List[RebalanceAction] recommended_strategy: str target_allocation: Dict[str, float] class PerformanceReport(BaseModel): total_invested: float total_value: float total_gains: float overall_return_pct: float fund_performance: List[Dict[str, Any]] best_performer: Optional[str] = None worst_performer: Optional[str] = None max_return: float min_return: float volatility: float sharpe_ratio: float portfolio_metrics: PortfolioMetrics