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


# Section 2: Primary Research
class CompetitorCategoryAnalysis(BaseModel):
    competitor_category_id: Optional[int] = None
    reference_competitor: Optional[str] = "N/A"
    number_of_categories_stocked: Optional[int] = 0
    key_categories_stocked: Optional[str] = "N/A"
    stocking_observations: Optional[str] = "N/A"
    competitor_others_remark: Optional[str] = "N/A"
    research_methodology: Optional[str] = "N/A"
    shopping_behavior: Optional[str] = "N/A"
    consumer_others_remark: Optional[str] = "N/A"
    group_id: Optional[int] = None


# Section 3: Category Management
class PreSelectedCategory(BaseModel):
    pre_id: Optional[int] = None
    low_value: Optional[int] = 0
    medium_value: Optional[int] = 0
    high_value: Optional[int] = 0
    group_id: Optional[int] = None


class StoreFormat(BaseModel):
    store_id: Optional[int] = None
    store_name: Optional[str] = "N/A"
    store_format_type: Optional[str] = "N/A"
    merchandise: Optional[str] = "N/A"
    group_id: Optional[int] = None


class CategoryRoleManagement(BaseModel):
    category_role_id: Optional[int] = None
    category_name: Optional[str] = "N/A"
    category_role: Optional[str] = "N/A"
    sales_contribution: Optional[float] = 0.0
    margin_contribution: Optional[float] = 0.0
    group_id: Optional[int] = None


# Section 4: Gross Margin Contributions
class GrossMarginContribution(BaseModel):
    gross_id: Optional[int] = None
    contribution_to_total_sales: Optional[float] = 0.0
    contribution_to_gross_margin: Optional[float] = 0.0
    rationale: Optional[str] = "N/A"
    group_id: Optional[int] = None


class MarginAndSalesContributionAnalysis(BaseModel):
    margin_id: Optional[int] = None
    which_category_do_you_think_contributes_more_to_sales: Optional[str] = "N/A"
    which_category_do_you_think_contributes_more_to_gross_margins: Optional[str] = "N/A"
    which_category_do_you_think_represents_your_store: Optional[str] = "N/A"
    group_id: Optional[int] = None


# Section 5: Summary
class Summary(BaseModel):
    summary_id: Optional[int] = None
    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] = None


class Module4ReportPreview(BaseModel):
    group_id: int
    # Section 2: Primary Research
    competitor_analysis: CompetitorCategoryAnalysis
    # Section 3: Category Management
    pre_selected_categories: PreSelectedCategory
    store_formats: List[StoreFormat]
    category_role_management: List[CategoryRoleManagement] = Field(default_factory=list)
    # Section 4: Gross Margin Contributions
    gross_margin_contributions: List[GrossMarginContribution]
    margin_sales_analysis: MarginAndSalesContributionAnalysis
    # Section 5: Summary
    summary: Summary
    last_updated: datetime