from sqlalchemy import desc
from sqlalchemy.orm import Session
from app.api.pre_selected_service import schema
from app.dependency.authantication import JWTPayloadSchema
from fastapi import HTTPException

from app.models.main.group import TblGroup
from app.models.main.main_data import TblMainData
from app.models.main.store_formate import TblStoreFormat

class PreSelectedServiceService:
    def __init__(self, db:Session, token:JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def get_pre_selected_service(self, group_id:int) ->list[schema.PreValidation]:
        store_formats = (
            self.db.query(TblStoreFormat)
            .filter(TblStoreFormat.group_id == group_id)
            .all()
        )
        
        if not store_formats:
            raise HTTPException(status_code=404, detail="not found")
        
        group = self.db.query(TblGroup).filter(TblGroup.group_id == group_id).first()
        if not group:
            raise HTTPException(status_code=404, detail="Group not found")
        
        main_data = (
            self.db.query(TblMainData)
            .filter(
                (TblMainData.format_type == group.category_assigned)
                | (TblMainData.format_type == group.category)
            )
            .order_by(desc(TblMainData.data_id))
            .first()
        )
        if not main_data:
            raise HTTPException(status_code=404, detail="Main data not found")
        
        
        service_parameters_map = {
            str(main_data.services_l or 0) : "Low",
            str(main_data.services_m or 0) : "Medium",
            str(main_data.services_h or 0) : "High",
        }
        
        response = []
        for sf in store_formats:
            response.append(
                schema.PreValidation(
                    store_format_type = sf.store_format_type,
                    service_parameters = service_parameters_map.get(sf.service_parameters, "UnKnown"),
                    service_parameters_value = sf.service_parameters
                )
            )
        return response