from pydantic import BaseModel, Field
from typing import List, Optional, Dict, Any
from datetime import datetime

class KPIMetric(BaseModel):
    name: str
    value: float
    unit: str = ""
    target: Optional[float] = None
    status: str = "normal"  # normal, warning, critical
    description: Optional[str] = None

class FinancialMetrics(BaseModel):
    revenue: float = 0.0
    gross_profit: float = 0.0
    net_profit: float = 0.0
    gross_margin_percentage: float = 0.0
    net_margin_percentage: float = 0.0
    roi: float = 0.0
    total_investment: float = 0.0
    cash_flow: float = 0.0

class OperationalMetrics(BaseModel):
    total_stores: int = 0
    sales_per_sqft: float = 0.0
    inventory_turnover: float = 0.0
    customer_footfall: int = 0
    average_transaction_value: float = 0.0
    conversion_rate: float = 0.0

class StudentPerformance(BaseModel):
    student_id: int
    student_name: str
    group_name: str
    completion_status: str
    modules_completed: int
    total_score: float
    financial_performance: FinancialMetrics
    operational_performance: OperationalMetrics

class GroupPerformance(BaseModel):
    group_id: int
    group_name: str
    category: Optional[str] = None
    participants_count: int
    completion_percentage: float
    average_score: float
    financial_metrics: FinancialMetrics
    operational_metrics: OperationalMetrics
    ranking: int = 0

class SimulationSummary(BaseModel):
    simulation_id: int
    simulation_name: str
    start_date: datetime
    end_date: Optional[datetime] = None
    total_groups: int
    total_participants: int
    completion_rate: float
    average_performance_score: float

class ComprehensiveReportRequest(BaseModel):
    simulation_id: Optional[int] = None
    group_id: Optional[int] = None
    student_id: Optional[int] = None
    report_type: str = "comprehensive"  # comprehensive, financial, operational, comparison
    include_charts: bool = True
    include_detailed_analysis: bool = True

class PDFReportResponse(BaseModel):
    report_id: str
    file_name: str
    file_size: int
    generation_time: datetime
    report_type: str
    status: str = "completed"