from typing import Literal
from pydantic import BaseModel, Field
from sqlalchemy.orm import Mapped, mapped_column, relationship, Session
from sqlalchemy import ForeignKey, Integer, VARCHAR, Enum, Float
from app.models.base_class import Base

class CentralisedAndDirectBase(BaseModel):
    centralised_direct_id : int | None = Field(default=None)
    distribution_type : Literal["Centralised Warehouse Distribution", "Direct Store Delivery Distribution"]
    
    #Centralised Warehouse Distribution
    
    about_warehouse : str | None = Field(default=None)
    warehouse_size : float | None = Field(default=None)
    expected_number_of_warehouse : int | None = Field(default=None)
    expected_number_of_warehouse_increase_every_year : int | None = Field(default=None)
    utilities_cost : float | None = Field(default=None)
    employee_cost_per_head : float | None = Field(default=None)
    rental_expenses : float | None = Field(default=None)
    transportation_cost : float | None = Field(default=None)
    number_of_employees : int | None = Field(default=None)
    # types : Literal["Putaway", "Flowthrough"]
    types : str | None = Field(default=None)
    centralised_additional_remark : str | None = Field(default=None)
    
    #Direct Store Delivery Distribution
    
    about_direct : str | None = Field(default=None)
    space_allotted_in_a_store : int | None = Field(default=None)
    employees_in_charge_at_store_level : int | None = Field(default=None)
    salary_of_each_employee : float | None = Field(default=None)
    unloading_policies : str | None = Field(default=None)
    checking_policies : str | None = Field(default=None)
    direct_aaditional_remarks : str | None = Field(default=None)
    group_id : int | None = Field(default=None)

class TblCentralisedAndDirect(Base):
    __tablename__ = "tbl_centralised_and_direct"
    
    centralised_direct_id : Mapped[int] = mapped_column("centralised_direct_id", Integer, primary_key=True, autoincrement=True)
    distribution_type : Mapped[str] = mapped_column("distribution_type", (Enum("Centralised Warehouse Distribution", "Direct Store Delivery Distribution")))
    
    #Centralised Warehouse Distribution
    about_warehouse : Mapped[str] = mapped_column("about_warehouse", VARCHAR(255))
    warehouse_size : Mapped[float] = mapped_column("warehouse_size", Float)
    expected_number_of_warehouse : Mapped[int] = mapped_column("expected_number_of_warehouse", Integer)
    expected_number_of_warehouse_increase_every_year : Mapped[int] = mapped_column("expected_number_of_warehouse_increase_every_year", Integer)
    utilities_cost : Mapped[float] = mapped_column("utilities_cost", Float)
    employee_cost_per_head : Mapped[float] = mapped_column("employee_cost_per_head", Float)
    rental_expenses : Mapped[float] = mapped_column("rental_expenses", Float)
    transportation_cost : Mapped[float] = mapped_column("transportation_cost", Float)
    number_of_employees : Mapped[int] = mapped_column("number_of_employees", Integer)
    types : Mapped[str] = mapped_column("types", Enum("Putaway", "Flowthrough"))
    centralised_additional_remark : Mapped[str] = mapped_column("centralised_additional_remark", VARCHAR(255))
    
    #Direct Store Delivery Distribution
    about_direct : Mapped[str] = mapped_column("about_direct", VARCHAR(255))
    space_allotted_in_a_store : Mapped[int] = mapped_column("space_allotted_in_a_store", Integer)
    employees_in_charge_at_store_level : Mapped[int] = mapped_column("employees_in_charge_at_store_level", Integer)
    salary_of_each_employee : Mapped[float] = mapped_column("salary_of_each_employee", Float)
    unloading_policies : Mapped[str] = mapped_column("unloading_policies", VARCHAR(255))
    checking_policies : Mapped[str] = mapped_column("checking_policies", VARCHAR(255))
    direct_aaditional_remarks : Mapped[str] = mapped_column("direct_aaditional_remarks", VARCHAR(255))
    group_id : Mapped[int] = mapped_column("group_id", ForeignKey("tbl_group.group_id"))
    
    # centralised_direct_id : Mapped[int] = mapped_column("centralised_direct_id", Integer, primary_key=True, autoincrement=True)
    # distribution_type : Mapped[str] = mapped_column("distribution_type", (Enum("Centralised Warehouse Distribution", "Direct Store Delivery Distribution")))
    
    # #Centralised Warehouse Distribution
    # about_warehouse : Mapped[str] = mapped_column("about_warehouse", VARCHAR(255), nullable=True, server_default=None)
    # warehouse_size : Mapped[float] = mapped_column("warehouse_size", Float, nullable=True, server_default=None)
    # expected_number_of_warehouse : Mapped[int] = mapped_column("expected_number_of_warehouse", Integer, nullable=True, server_default=None)
    # expected_number_of_warehouse_increase_every_year : Mapped[int] = mapped_column("expected_number_of_warehouse_increase_every_year", Integer, nullable=True, server_default=None)
    # utilities_cost : Mapped[float] = mapped_column("utilities_cost", Float, nullable=True, server_default=None)
    # employee_cost_per_head : Mapped[float] = mapped_column("employee_cost_per_head", Float, nullable=True, server_default=None)
    # rental_expenses : Mapped[float] = mapped_column("rental_expenses", Float, nullable=True, server_default=None)
    # transportation_cost : Mapped[float] = mapped_column("transportation_cost", Float, nullable=True, server_default=None)
    # number_of_employees : Mapped[int] = mapped_column("number_of_employees", Integer, nullable=True, server_default=None)
    # types : Mapped[str] = mapped_column("types", Enum("Putaway", "Flowthrough"))
    # centralised_additional_remark : Mapped[str] = mapped_column("centralised_additional_remark", VARCHAR(255), nullable=True, server_default=None)
    
    # #Direct Store Delivery Distribution
    # about_direct : Mapped[str] = mapped_column("about_direct", VARCHAR(255), nullable=True, server_default=None)
    # space_allotted_in_a_store : Mapped[int] = mapped_column("space_allotted_in_a_store", Integer, nullable=True, server_default=None)
    # employees_in_charge_at_store_level : Mapped[int] = mapped_column("employees_in_charge_at_store_level", Integer, nullable=True, server_default=None)
    # salary_of_each_employee : Mapped[float] = mapped_column("salary_of_each_employee", Float, nullable=True, server_default=None)
    # unloading_policies : Mapped[str] = mapped_column("unloading_policies", VARCHAR(255), nullable=True, server_default=None)
    # checking_policies : Mapped[str] = mapped_column("checking_policies", VARCHAR(255), nullable=True, server_default=None)
    # direct_aaditional_remarks : Mapped[str] = mapped_column("direct_aaditional_remarks", VARCHAR(255), nullable=True, server_default=None)
    # group_id : Mapped[int] = mapped_column("group_id", ForeignKey("tbl_group.group_id"))
    
    group = relationship("TblGroup", back_populates="centralised_direct")
    
    @classmethod
    def create_centralised_and_direct(cls, data:CentralisedAndDirectBase, db:Session) ->"TblCentralisedAndDirect":
        data_dict = data.model_dump()
        data_dict["distribution_type"] = TblCentralisedAndDirect.distribution_type
        new_data = cls(**data_dict)
        db.add(new_data)
        db.flush()
        return new_data
    
    