from typing import List, Optional
from datetime import datetime
from app.utils.schemas_utils import CustomModel


# Section 2: Location Selection & Section 3: Network Planning (tbl_network_planning)
class NetworkPlanning(CustomModel):
    network_id: Optional[int] = 0
    location: Optional[str] = "N/A"
    state: Optional[str] = "N/A"
    total_hh: Optional[int] = 0
    target_hh: Optional[int] = 0
    area: Optional[float] = 0.0
    action: Optional[str] = "N/A"
    format_a_y1: Optional[int] = 0
    format_a_y2: Optional[int] = 0
    format_a_y3: Optional[int] = 0
    format_a_y4: Optional[int] = 0
    format_a_y5: Optional[int] = 0
    format_b_y1: Optional[int] = 0
    format_b_y2: Optional[int] = 0
    format_b_y3: Optional[int] = 0
    format_b_y4: Optional[int] = 0
    format_b_y5: Optional[int] = 0
    total_store_count_y1: Optional[int] = 0
    total_store_count_y2: Optional[int] = 0
    total_store_count_y3: Optional[int] = 0
    total_store_count_y4: Optional[int] = 0
    total_store_count_y5: Optional[int] = 0
    group_id: Optional[int] = 0


# Trading Months (part of Pre-Operating Expenses section)
class TradingMonths(CustomModel):
    trading_id: Optional[int] = 0
    store_a_trading_months: Optional[str] = "N/A"
    store_b_trading_months: Optional[str] = "N/A"
    rationale_for_store_a: Optional[str] = "N/A"
    rationale_for_store_b: Optional[str] = "N/A"
    group_id: Optional[int] = 0


# Section 4: Pre-Operating Expenses (tbl_pre_operating_expense)
class PreOperatingExpenses(CustomModel):
    pre_operating_id: Optional[int] = 0
    pre_operating_months_store_a: Optional[int] = 0
    pre_operating_months_store_b: Optional[int] = 0
    marketing_expenses_store_a: Optional[int] = 0
    marketing_expenses_store_b: Optional[int] = 0
    accounting_benefits_store_a: Optional[str] = "N/A"
    accounting_benefits_store_b: Optional[str] = "N/A"
    other_remarks_store_a: Optional[str] = "N/A"
    other_remarks_store_b: Optional[str] = "N/A"
    group_id: Optional[int] = 0


# Store Investment Summary (calculated from various modules)
class StoreInvestmentSummary(CustomModel):
    capital_expenses_a: Optional[int] = 0
    capital_expenses_b: Optional[int] = 0
    it_capital_expenses_a: Optional[int] = 0
    it_capital_expenses_b: Optional[int] = 0
    total_store_capital_expenses_a: Optional[int] = 0
    total_store_capital_expenses_b: Optional[int] = 0
    rental_advance_a: Optional[int] = 0
    rental_advance_b: Optional[int] = 0
    pre_operating_expenses_a: Optional[int] = 0
    pre_operating_expenses_b: Optional[int] = 0
    marketing_expenses_a: Optional[int] = 0
    marketing_expenses_b: Optional[int] = 0
    total_store_investment_a: Optional[int] = 0
    total_store_investment_b: Optional[int] = 0
    group_id: Optional[int] = 0
    
    # Additional fields for calculations
    rent_per_month_a: Optional[int] = 0
    rent_per_month_b: Optional[int] = 0
    utilities_a: Optional[int] = 0
    utilities_b: Optional[int] = 0
    employee_wages_a: Optional[int] = 0
    employee_wages_b: Optional[int] = 0
    pre_operating_months_a: Optional[int] = 0
    pre_operating_months_b: Optional[int] = 0
    
    @property
    def calculated_pre_operating_expenses_a(self) -> int:
        """Pre-operating Expenses = Number of PreOperating Month × (Rent per Month + Utilities + Employee Wages) + Marketing Expenses"""
        monthly_costs = (self.rent_per_month_a or 0) + (self.utilities_a or 0) + (self.employee_wages_a or 0)
        return (self.pre_operating_months_a or 0) * monthly_costs + (self.marketing_expenses_a or 0)
    
    @property
    def calculated_pre_operating_expenses_b(self) -> int:
        """Pre-operating Expenses = Number of PreOperating Month × (Rent per Month + Utilities + Employee Wages) + Marketing Expenses"""
        monthly_costs = (self.rent_per_month_b or 0) + (self.utilities_b or 0) + (self.employee_wages_b or 0)
        return (self.pre_operating_months_b or 0) * monthly_costs + (self.marketing_expenses_b or 0)
    
    @property
    def calculated_total_capital_expenses_a(self) -> int:
        """Total Capital Expenses = Capital Expenses excl.IT + IT Capital Expenses"""
        return (self.capital_expenses_a or 0) + (self.it_capital_expenses_a or 0)
    
    @property
    def calculated_total_capital_expenses_b(self) -> int:
        """Total Capital Expenses = Capital Expenses excl.IT + IT Capital Expenses"""
        return (self.capital_expenses_b or 0) + (self.it_capital_expenses_b or 0)
    
    @property
    def calculated_total_store_investment_a(self) -> int:
        """Store Investment = Total Capital Expenses + Rental Advance + Pre-operating Expenses"""
        return self.calculated_total_capital_expenses_a + (self.rental_advance_a or 0) + self.calculated_pre_operating_expenses_a
    
    @property
    def calculated_total_store_investment_b(self) -> int:
        """Store Investment = Total Capital Expenses + Rental Advance + Pre-operating Expenses"""
        return self.calculated_total_capital_expenses_b + (self.rental_advance_b or 0) + self.calculated_pre_operating_expenses_b


# Section 5: Summary (tbl_summary)
class Module3Summary(CustomModel):
    summary_id: Optional[int] = 0
    network_submissions: Optional[str] = "N/A"
    network_summarise: Optional[str] = "N/A"
    group_id: Optional[int] = 0


class Module3ReportPreview(CustomModel):
    group_id: int
    network_planning: List[NetworkPlanning]  # Sections 2 & 3
    trading_months: TradingMonths  # Part of Section 4
    pre_operating_expenses: PreOperatingExpenses  # Section 4
    store_investment_summary: StoreInvestmentSummary  # Part of Section 4
    summary: Module3Summary  # Section 5
    last_updated: datetime
    
    @property
    def total_locations(self) -> int:
        return len([n for n in self.network_planning if n.location and n.location != "N/A"])
    
    @property
    def total_stores_year_5(self) -> int:
        return sum(n.total_store_count_y5 or 0 for n in self.network_planning)
    
    @property
    def format_a_stores_year_5(self) -> int:
        return sum(n.format_a_y5 or 0 for n in self.network_planning)
    
    @property
    def format_b_stores_year_5(self) -> int:
        return sum(n.format_b_y5 or 0 for n in self.network_planning)