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


class CustomerSegmentEstimate(CustomModel):
    customer_location_id: Optional[int] = 0
    ISEC_Segment: Optional[int] = 0
    sample_size: Optional[int] = 0
    average_age: Optional[int] = 0
    income_levels: Optional[str] = "N/A"
    occupation_mode: Optional[str] = "N/A"
    education_level_mode: Optional[str] = "N/A"
    shopping_frequency_per_month: Optional[int] = 0
    household_consumption_per_month: Optional[int] = 0
    total_household_consumption_per_month: Optional[int] = 0
    group_id: Optional[int] = 0


class CatchmentPotential(CustomModel):
    catch_id: Optional[int] = 0
    ISEC_Segment: Optional[int] = 0
    number_of_households: Optional[int] = 0
    percentage_of_segment: Optional[float] = 0.0
    potential_number_of_households: Optional[int] = 0
    group_id: Optional[int] = 0


class CompetitionIntensity(CustomModel):
    competitor_id: Optional[int] = 0
    upload_image: Optional[str] = "N/A"
    total_square_footage: Optional[str] = None
    assumptions: Optional[str] = "N/A"
    group_id: Optional[int] = 0


class CompetitorBenchmarking(CustomModel):
    competitorbenchmarking_id: Optional[int] = 0
    reference_competitor: Optional[str] = "N/A"
    bills_per_month: Optional[int] = 0
    items_pre_bill: Optional[int] = 0
    avg_price: Optional[int] = 0
    other_remark: Optional[str] = "N/A"
    group_id: Optional[int] = 0


class LocationSpillageFactor(CustomModel):
    location_id: Optional[int] = 0
    estimated_spillage_factor: Optional[str] = None
    assumptions: Optional[str] = "N/A"
    group_id: Optional[int] = 0

class LocationDetails(CustomModel):
    details_id: Optional[int] = 0
    trading_radius: Optional[int] = 0
    trading_rational: Optional[str] = "N/A"
    adjacencies: Optional[str] = "N/A"
    adjacencies_rational: Optional[str] = "N/A"
    location_characteristics: Optional[str] = "N/A"
    corner_property_rational: Optional[str] = "N/A"
    rational: Optional[str] = "N/A"
    details: Optional[Dict] = {}
    store_format_type: Optional[str] = None
    group_id: Optional[int] = 0


class SalesEstimate(CustomModel):
    sales_id: Optional[int] = 0
    parameter: Optional[str] = "N/A"
    value: Optional[int] = 0
    remark: Optional[str] = "N/A"
    store_formate_type: Optional[str] = None
    group_id: Optional[int] = 0


class RentExpenses(CustomModel):
    rent_id: Optional[int] = 0
    store_size: Optional[int] = 0
    rental_advance_amount: Optional[int] = 0
    rental_advance_period: Optional[int] = 0
    rent_per_month: Optional[int] = 0
    store_format_type: Optional[str] = None
    rational_for_rental_expenses: Optional[str] = "N/A"
    group_id: Optional[int] = 0


class SalesSummaryComparison(CustomModel):
    store_format_type: Optional[str] = None
    sales_potential: Optional[float] = 0.0
    sales_estimate: Optional[float] = 0.0
    group_id: Optional[int] = 0

class Module2Summary(CustomModel):
    summary_id: Optional[int] = 0
    promotions_submissions: Optional[str] = "N/A"  
    promotions_summarise: Optional[str] = "N/A"    
    group_id: Optional[int] = 0


class Module2ReportPreview(CustomModel):
    group_id: int
    customer_segment_estimates: List[CustomerSegmentEstimate]
    catchment_potential: List[CatchmentPotential]
    competition_intensity: CompetitionIntensity
    competitor_benchmarking: List[CompetitorBenchmarking]
    location_spillage_factor: List[LocationSpillageFactor]
    location_details: List[LocationDetails]
    sales_estimates: List[SalesEstimate]
    rent_expenses: List[RentExpenses]
    sales_summary_comparison: List[SalesSummaryComparison]
    summary: Module2Summary
    last_updated: datetime
    
    @property
    def estimated_market_share(self) -> float:
        return 0.0
    
    @property
    def total_sqft_of_competition(self) -> str:
        return self.competition_intensity.total_square_footage or "N/A"
    
    @property
    def spillage_factor(self) -> str:
        if self.location_spillage_factor and self.location_spillage_factor[0].estimated_spillage_factor:
            return self.location_spillage_factor[0].estimated_spillage_factor
        return "N/A"
    
    @property
    def estimated_sales_a(self) -> float:
        return 0.0
    
    @property
    def estimated_sales_b(self) -> float:
        return 0.0