from typing import Literal, Optional
from pydantic import Field, field_validator
from app.utils.schemas_utils import CustomModel


class CentralisedCreate(CustomModel):
    group_id: Optional[int] = None
    about_warehouse: Optional[str] = None
    warehouse_size: Optional[float] = None
    expected_number_of_warehouse: Optional[int] = None
    expected_number_of_warehouse_increase_every_year: Optional[int] = None
    utilities_cost: Optional[float] = None
    employee_cost_per_head: Optional[float] = None
    rental_expenses: Optional[float] = None
    transportation_cost: Optional[float] = None
    number_of_employees: Optional[int] = None
    types: Optional[Literal["Putaway", "Flowthrough"]] = None
    centralised_additional_remark: Optional[str] = None

    @field_validator("number_of_employees")
    def validate_employee_limit(cls, v):
        if v is not None and v > 2:
            raise ValueError("Number of employees cannot exceed 2")
        return v


class DirectCreate(CustomModel):
    group_id: Optional[int] = None
    about_direct: Optional[str] = None
    space_allotted_in_a_store: Optional[int] = None
    employees_in_charge_at_store_level: Optional[int] = None
    salary_of_each_employee: Optional[float] = None
    unloading_policies: Optional[str] = None
    checking_policies: Optional[str] = None
    direct_additional_remarks: Optional[str] = None

    @field_validator("employees_in_charge_at_store_level")
    def validate_employee_limit(cls, v):
        if v is not None and v > 2:
            raise ValueError("Employees in charge at store level cannot exceed 2")
        return v


class DistributionCreate(CustomModel):
    distribution_type: Literal["Centralised Warehouse Distribution", "Direct Store Delivery Distribution"]
    centralised: Optional[CentralisedCreate] = None
    direct: Optional[DirectCreate] = None
    
class CentralisedAndDirectResponse(CustomModel):
    centralised_direct_id : int
    group_id: Optional[int] = None
    about_warehouse: Optional[str] = None
    warehouse_size: Optional[float] = None
    expected_number_of_warehouse: Optional[int] = None
    expected_number_of_warehouse_increase_every_year: Optional[int] = None
    utilities_cost: Optional[float] = None
    employee_cost_per_head: Optional[float] = None
    rental_expenses: Optional[float] = None
    transportation_cost: Optional[float] = None
    number_of_employees: Optional[int] = None
    types: Optional[Literal["Putaway", "Flowthrough"]] = None
    centralised_additional_remark: Optional[str] = None
    
    about_direct: Optional[str] = None
    space_allotted_in_a_store: Optional[int] = None
    employees_in_charge_at_store_level: Optional[int] = None
    salary_of_each_employee: Optional[float] = None
    unloading_policies: Optional[str] = None
    checking_policies: Optional[str] = None
    direct_additional_remarks: Optional[str] = None

    
    
