from typing import Optional
from pydantic import Field
from app.utils.schemas_utils import CustomModel

class GroupCreate(CustomModel):
    simulation_code: str 
    group_name: str 
    group_email: str 
    category_assigned: str 
    number_of_members: int

class GroupRespose(GroupCreate):
    group_id: int 
    category: str| None = Field(default=None)
    group_code: str
    pass

class GroupUpdate(CustomModel):
    group_id: int 
    simulation_id: int | None = Field(default=None)
    group_name: str | None = Field(default=None)
    group_email: str | None = Field(default=None)
    category_assigned: str | None = Field(default=None)
    number_of_members: int | None = Field(default=None)
    
class GetSimulationGroup(CustomModel):
    group_id: int 
    group_name: str
    group_email: str
    category_assigned: str
    category: Optional[str] = None
    number_of_members: int
    simulation_code: str 
    group_code : str

class StudentInfo(CustomModel):
    student_id: int
    first_name: str | None
    last_name: str | None
    student_email: str | None

class GroupCategoryResponse(CustomModel):
    category_assigned: Optional[str] = None
    category: Optional[str] = None    


class ExcelGroupEntry(CustomModel):
    group_no: str
    format_type: str
    reference_retailer: Optional[str]
    no_of_stores: int
    no_of_sub_cats_L: Optional[int]
    no_of_sub_cats_M: Optional[int]
    no_of_sub_cats_H: Optional[int]
    indicative_size: Optional[int]
    indicative_capital: Optional[float]
    approx_investment_per_store: Optional[float]
    competition_intensity_L: Optional[int]
    competition_intensity_M: Optional[int]
    competition_intensity_H: Optional[int]
    tech_investment_H: Optional[float]
    tech_investment_M: Optional[float]
    tech_investment_L: Optional[float]
    spillage_factor_H: Optional[float]
    spillage_factor_L: Optional[float]


class MainDataSchema(CustomModel):
    data_id: int
    category_identifier: Optional[str]
    format_type: Optional[str]
    reference_retailer: Optional[str]
    no_of_stores: Optional[int]
    description: Optional[str]
    no_of_cats_l: Optional[int]
    no_of_cats_m: Optional[int]
    no_of_cats_h: Optional[int]
    indicative_size: Optional[int]
    capital_available: Optional[float]
    approx_investment: Optional[float]
    comp_intensity_l: Optional[float]
    comp_intensity_m: Optional[float]
    comp_intensity_h: Optional[float]
    tech_inv_h: Optional[int]
    tech_inv_m: Optional[int]
    tech_inv_l: Optional[int]
    spillage_h: Optional[float]
    spillage_l: Optional[float]
    services_h: Optional[int]
    services_m: Optional[int]
    services_l: Optional[int]




# def create_category(self, request: CategoryCreate):
#         group = TblGroup.get_group(request.group_id, self.db)
#         if not group:
#             raise HTTPException(status_code=404, detail=Messages.GROUP_NOT_FOUND)
#         if group.category_assigned:
#             return CustomResponse(status="0", message="Category already assigned by admin.")
#         sim_code = group.sim_code
#         existing_category = self.db.query(TblGroup).filter(
#             TblGroup.sim_code == sim_code,
#             TblGroup.category_assigned == request.choose_category
#         ).first()
#         if existing_category:
#             return CustomResponse(status="0", message="This category is already assigned to another group in the same simulation.")
#         if group.category_assigned:
#             return CustomResponse(status="0", message="Category already assigned to this group.")
#         TblCategory.create(CategoryCreate.model_validate(request.model_dump()), self.db)
#         group.category_assigned = request.choose_category
#         self.db.commit()
#         return CustomResponse(status="1", message=Messages.GROUP_CATEGORY)