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

class Brand(CustomModel):
    brand_id: Optional[int] = 0
    brand_name: Optional[str] = "N/A"
    brand_image: Optional[str] = "N/A"
    rationale: Optional[str] = "N/A"
    group_id: Optional[int] = 0

class Segment(CustomModel):
    segment_id: Optional[int] = 0
    segment_name: Optional[str] = "N/A"
    location: Optional[str] = "N/A"
    chief_wage_earner_occupation: Optional[str] = "N/A"
    male_education: Optional[str] = "N/A"
    female_education: Optional[str] = "N/A"
    isec_value: Optional[int] = 0
    total_population: Optional[int] = 0
    additional_details: Optional[str] = "N/A"
    group_id: Optional[int] = 0
    
    @classmethod
    def from_orm(cls, obj):
        return cls(
            segment_id=obj.segment_id,
            segment_name=obj.name,
            location=obj.location,
            chief_wage_earner_occupation=obj.chief_wage_earner_occupation,
            male_education=obj.highest_educated_male,
            female_education=obj.highest_educated_female,
            isec_value=obj.ISEC_Segment,
            total_population=obj.total_population,
            additional_details=obj.other_details,
            group_id=obj.group_id
        )

class StoreFormat(CustomModel):
    store_id: Optional[int] = 0
    store_name: Optional[str] = "N/A"
    store_name_rationale: Optional[str] = "N/A"
    store_size: Optional[float] = 0.0
    merchandise: Optional[str] = "N/A"
    location: Optional[str] = "N/A"
    additional_location_parameters: Optional[str] = "N/A"
    service_parameters: Optional[str] = "N/A"
    technology_adoption: Optional[str] = "N/A"
    other_parameters: Optional[str] = "N/A"
    store_format_type: Optional[str] = "N/A"
    group_id: Optional[int] = 0

class Civil(CustomModel):
    civil_id: Optional[int] = 0
    group_id: Optional[int] = 0
    store_format_type: Optional[str] = "N/A"
    type_of_civil_work: Optional[str] = "N/A"
    rate_per_sqft: Optional[float] = 0.0
    total_sqft: Optional[float] = 0.0
    total: Optional[float] = 0.0
    remarks: Optional[str] = "N/A"

class DisplayRackingUnit(CustomModel):
    rack_id: Optional[int] = 0
    group_id: Optional[int] = 0
    store_format_type: Optional[str] = "N/A"
    type_display_racking_unit: Optional[str] = "N/A"
    number_of_units: Optional[int] = 0
    cost_per_unit: Optional[float] = 0.0
    total: Optional[float] = 0.0
    remarks: Optional[str] = "N/A"

class CommercialEquipment(CustomModel):
    equipment_id: Optional[int] = 0
    group_id: Optional[int] = 0
    store_format_type: Optional[str] = "N/A"
    type_of_equipment: Optional[str] = "N/A"
    units: Optional[int] = 0
    cost_per_unit: Optional[float] = 0.0
    equipment_type: Optional[str] = "universal"  # universal or specialised
    total: Optional[float] = 0.0
    remarks: Optional[str] = "N/A"

class Plumbing(CustomModel):
    plumb_id: Optional[int] = 0
    group_id: Optional[int] = 0
    type: Optional[str] = "N/A"  # washrooms, wash basins, water pipes, cleaning units
    units: Optional[int] = 0
    cost_per_unit: Optional[float] = 0.0
    total: Optional[float] = 0.0
    remarks: Optional[str] = "N/A"

class ElectricalCabling(CustomModel):
    electrical_id: Optional[int] = 0
    group_id: Optional[int] = 0
    store_format_type: Optional[str] = "N/A"
    feature: Optional[str] = "N/A"  # HVAC, Lighting, Cabling
    details: Optional[str] = "N/A"  # Tonnes for HVAC, etc.
    rate_per_sqft_or_unit: Optional[float] = 0.0
    total: Optional[float] = 0.0
    remarks: Optional[str] = "N/A"

class Carpentry(CustomModel):
    carpentry_id: Optional[int] = 0
    group_id: Optional[int] = 0
    store_format_type: Optional[str] = "N/A"
    type: Optional[str] = "N/A"  # Service Desk, POS Counters, etc.
    units: Optional[int] = 0
    cost_per_unit: Optional[float] = 0.0
    total: Optional[float] = 0.0
    remarks: Optional[str] = "N/A"

class InfoTech(CustomModel):
    info_tech_id: Optional[int] = 0
    group_id: Optional[int] = 0
    store_format_type: Optional[str] = "N/A"
    type: Optional[str] = "N/A"  # Cash Tills/POS, Scanners, Computers, etc.
    category: Optional[str] = "N/A"  # Software, Hardware, Physical
    units: Optional[int] = 0
    cost_per_unit: Optional[float] = 0.0
    total: Optional[float] = 0.0
    remarks: Optional[str] = "N/A"
    available_capital: Optional[float] = 0.0

class VisualMerchandisingElements(CustomModel):
    visual_id: Optional[int] = 0
    group_id: Optional[int] = 0
    type: Optional[str] = "N/A"
    units: Optional[int] = 0
    cost: Optional[float] = 0.0
    total: Optional[float] = 0.0
    remarks: Optional[str] = "N/A"
    internal_display: Optional[str] = "N/A"
    external_display: Optional[str] = "N/A"
    frequency_change_per_year: Optional[int] = 0
    frequency_change_remarks: Optional[str] = "N/A"

class DisplayBoard(CustomModel):
    display_board_id: Optional[int] = 0
    group_id: Optional[int] = 0
    store_format_type: Optional[str] = "N/A"
    type: Optional[str] = "N/A"
    size: Optional[str] = "N/A"
    pricing_type: Optional[str] = "unit"  # unit, sqft, etc.
    cost_rate: Optional[float] = 0.0
    units: Optional[int] = 0
    total: Optional[float] = 0.0
    remarks: Optional[str] = "N/A"

class AdditionalInstallations(CustomModel):
    installation_id: Optional[int] = 0
    group_id: Optional[int] = 0
    name: Optional[str] = "N/A"
    description: Optional[str] = "N/A"
    cost_per_unit: Optional[float] = 0.0
    total_cost: Optional[float] = 0.0
    remarks: Optional[str] = "N/A"

class Depreciation(CustomModel):
    depreciation_id: Optional[int] = 0
    group_id: Optional[int] = 0
    slm_years: Optional[int] = 0
    slm_remarks: Optional[str] = "N/A"
    other_methods: Optional[str] = "N/A"
    depreciation_method: Optional[str] = "N/A"
    
class CapitalExpensesSummary(CustomModel):
    summary_id: Optional[int] = 0
    group_id: Optional[int] = 0
    store_format_a_capital_excl_it: Optional[float] = 0.0
    store_format_a_it_capital: Optional[float] = 0.0
    store_format_a_total: Optional[float] = 0.0
    store_format_b_capital_excl_it: Optional[float] = 0.0
    store_format_b_it_capital: Optional[float] = 0.0
    store_format_b_total: Optional[float] = 0.0
    additional_remarks: Optional[str] = "N/A"
    key_takeaways: Optional[str] = "N/A"

class Summary(CustomModel):
    summary_id: Optional[int] = 0
    store_submissions: Optional[str] = "N/A"
    store_summarise: Optional[str] = "N/A"
    location_submissions: Optional[str] = "N/A"
    location_summarise: Optional[str] = "N/A"
    network_submissions: Optional[str] = "N/A"
    network_summarise: Optional[str] = "N/A"
    category_submissions: Optional[str] = "N/A"
    category_summarise: Optional[str] = "N/A"
    promotions_submissions: Optional[str] = "N/A"
    promotions_summarise: Optional[str] = "N/A"
    marketing_submissions: Optional[str] = "N/A"
    marketing_summarise: Optional[str] = "N/A"
    service_submissions: Optional[str] = "N/A"
    service_summarise: Optional[str] = "N/A"
    backend_submissions: Optional[str] = "N/A"
    backend_summarise: Optional[str] = "N/A"
    metrics_submissions: Optional[str] = "N/A"
    metrics_summarise: Optional[str] = "N/A"
    group_id: Optional[int] = 0

class Module1ReportPreview(CustomModel):
    group_id: int
    brand: Brand
    segments: List[Segment]
    store_formats: List[StoreFormat]
    civil: List[Civil]
    display_racking_units: List[DisplayRackingUnit]
    carpentry: List[Carpentry]
    electrical_cabling: List[ElectricalCabling]
    display_boards: List[DisplayBoard]
    commercial_equipment: List[CommercialEquipment]
    infotech: List[InfoTech]
    visual_merchandising: List[VisualMerchandisingElements]
    plumbing: List[Plumbing]
    additional_installations: List[AdditionalInstallations]
    depreciation:  Optional[Depreciation] = None
    capital_expenses_summary: CapitalExpensesSummary
    last_updated: datetime