from fastapi import APIRouter, Depends, HTTPException, Query from typing import Dict, Any, List from app.services.portfolio_analyzer import PortfolioAnalyzer from app.models.portfolio_models import ( Portfolio, PortfolioMetrics, PortfolioTemplate, RebalanceAnalysis, PerformanceReport ) router = APIRouter() @router.post("/metrics", response_model=PortfolioMetrics) async def calculate_portfolio_metrics(portfolio: Portfolio): """ Calculate portfolio-level metrics including total value, gains, and category allocation """ try: analyzer = PortfolioAnalyzer() metrics = analyzer.calculate_portfolio_metrics(portfolio.holdings) return metrics except Exception as e: raise HTTPException(status_code=500, detail=f"Error calculating portfolio metrics: {str(e)}") @router.post("/rebalance", response_model=RebalanceAnalysis) async def generate_rebalance_analysis(portfolio: Portfolio): """ Generate detailed rebalancing analysis and recommendations for a portfolio """ try: analyzer = PortfolioAnalyzer() rebalance_analysis = analyzer.generate_rebalance_analysis(portfolio.holdings) return rebalance_analysis except Exception as e: raise HTTPException(status_code=500, detail=f"Error generating rebalance analysis: {str(e)}") @router.post("/performance", response_model=PerformanceReport) async def generate_performance_report(portfolio: Portfolio): """ Generate comprehensive performance report for a portfolio """ try: analyzer = PortfolioAnalyzer() performance_report = analyzer.generate_performance_report(portfolio.holdings) return performance_report except Exception as e: raise HTTPException(status_code=500, detail=f"Error generating performance report: {str(e)}") @router.get("/template/{template}") async def get_portfolio_template(template: PortfolioTemplate): """ Get a predefined portfolio template (Conservative, Balanced, Aggressive, Custom Sample) """ try: analyzer = PortfolioAnalyzer() template_portfolio = analyzer.get_template_portfolio(template) return {"template": template_portfolio} except Exception as e: raise HTTPException(status_code=500, detail=f"Error getting portfolio template: {str(e)}") @router.get("/templates") async def get_all_portfolio_templates(): """ Get all available portfolio templates """ try: templates = {} for template in PortfolioTemplate: analyzer = PortfolioAnalyzer() template_portfolio = analyzer.get_template_portfolio(template) templates[template.value] = template_portfolio return templates except Exception as e: raise HTTPException(status_code=500, detail=f"Error getting portfolio templates: {str(e)}")