import io from fastapi.responses import StreamingResponse from datetime import datetime from fastapi import APIRouter, HTTPException from app.core.data_provider import IndianDataProvider from app.core.swarms_client import create_indian_compliance_swarm from app.models.schemas import ( StockDataRequest, StockDataResponse, ComplianceAnalysisRequest, ComplianceAnalysisResponse, GenerateCSVRequest ) from app.utils.helpers import create_comprehensive_csv_data router = APIRouter() data_provider = IndianDataProvider() @router.post("/stock-data", response_model=StockDataResponse) async def get_stock_data(request: StockDataRequest): """Fetch NSE stock data for a given symbol""" try: stock_data = data_provider.get_nse_stock_data(request.symbol) if not stock_data.get('success'): return StockDataResponse( success=False, error=stock_data.get('error', 'Unknown error') ) formatted_data = data_provider.format_stock_data_for_analysis(stock_data) return StockDataResponse( success=True, data=stock_data, formatted_data=formatted_data ) except Exception as e: raise HTTPException(status_code=500, detail=f"Error fetching stock data: {str(e)}") @router.post("/compliance-analysis", response_model=ComplianceAnalysisResponse) async def run_compliance_analysis(request: ComplianceAnalysisRequest): """Run compliance analysis on financial data""" try: result = create_indian_compliance_swarm( request.financial_data, request.company_info ) if "error" in result: return ComplianceAnalysisResponse( success=False, error=result["error"] ) return ComplianceAnalysisResponse( success=True, result=result ) except Exception as e: raise HTTPException(status_code=500, detail=f"Error running compliance analysis: {str(e)}") # Update the generate-csv endpoint @router.post("/generate-csv") async def generate_csv_report(request: GenerateCSVRequest): """Generate CSV report for compliance analysis and return as downloadable file""" try: df = create_comprehensive_csv_data( request.data_source, request.company_info, request.accounting_standards, request.regulatory_frameworks, request.result ) # Create a stream for the CSV data stream = io.StringIO() df.to_csv(stream, index=False) # Create a response that will download the CSV file response = StreamingResponse( iter([stream.getvalue()]), media_type="text/csv", headers={ "Content-Disposition": f"attachment; filename=compliance_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" } ) return response except Exception as e: raise HTTPException(status_code=500, detail=f"Error generating CSV: {str(e)}") @router.get("/popular-stocks") async def get_popular_stocks(): """Get list of popular NSE stocks""" popular_stocks = [ 'ADANIENT', 'ADANIPORTS', 'APOLLOHOSP', 'ASIANPAINT', 'AXISBANK', 'BAJAJ-AUTO', 'BAJFINANCE', 'BAJAJFINSV', 'BEL', 'BHARTIARTL', 'CIPL', 'COALINDIA', 'DRREDDY', 'EICHERMOT', 'GRASIM', 'HCLTECH', 'HDFCBANK', 'HDFCLIFE', 'HINDALCO', 'HINDUNILVR', 'ICICIBANK', 'INFY', 'ITC', 'JIOFIN', 'JSWSTEEL', 'KOTAKBANK', 'LT', 'M&M', 'MARUTI', 'MAXHEALTH', 'NESTLEIND', 'NTPC', 'ONGC', 'POWERGRID', 'RELIANCE', 'SBILIFE', 'SBIN', 'SHRIRAMFIN', 'SUNPHARMA', 'TATACONSUM', 'TCS', 'TATAMOTORS', 'TATASTEEL', 'TECHM', 'TITAN', 'TRENT', 'ULTRACEMCO', 'WIPRO', 'INDIGO','ETERNAL', 'HINDPETRO', 'TATAPOWER', 'BAJAJHLDNG', 'HEROMOTOCO', 'INDUSINDBK' ] return {"stocks": popular_stocks}