from typing import List
from app.api.category_pricing_strategis import schema
from app.models.main.category_pricing_strategis import CategoryPricingStrategisBase, TblCategoryPricingStrategis
from app.utils.schemas_utils import CustomResponse
from sqlalchemy.orm import Session
from fastapi import HTTPException
from app.dependency.authantication import JWTPayloadSchema
from app.locale.messages import Messages

class CategoryPricingStrategisService:
    def __init__(self, db:Session, token:JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def create_category_pricing_strategis(self, request:List[schema.CategoryPricingStrategisCreate]):
        created_category = []
        for item in request:
            request_data = item.model_dump()
            created_item = CategoryPricingStrategisBase.model_validate(request_data)
            sale = TblCategoryPricingStrategis.create_category_pricing_strategis(created_item, self.db)
            created_category.append(sale)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.CATEGORY_PRICING_STRATEGIS)
    
    async def get_category_pricing_strategis(self, group_id:int):
        new_get_category_pricing_strategis = TblCategoryPricingStrategis.get_category_pricing_strategis(group_id, self.db)
        if not new_get_category_pricing_strategis:
            raise HTTPException(status_code=404, detail="Get group ID not found")
        return [schema.CategoryPricingStrategisResponse.model_validate(get_group) for get_group in new_get_category_pricing_strategis]
    
    async def update_category_pricing_strategis(self, request:List[schema.CategoryPricingStrategisUpdate]):
        for req in request:
            updated_category_pricing_strategis = CategoryPricingStrategisBase.model_validate(req.model_dump())
            if updated_category_pricing_strategis.category_id is None:
                return CustomResponse(status="-1", message=Messages.CATEGORY_PRICING_STRATEGIS_NOT)
            TblCategoryPricingStrategis.update_category_pricing_strategis(updated_category_pricing_strategis.category_id, updated_category_pricing_strategis, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.CATEGORY_PRICING_STRATEGIS_UPDATE)
    
    async def delete_category_pricing_strategis(self, category_id:int):
        deleted_category_pricing_strategis = TblCategoryPricingStrategis.delete_category_pricing_strategis(category_id, self.db)
        if not deleted_category_pricing_strategis:
            return CustomResponse(status="-1", message=Messages.CATEGORY_PRICING_STRATEGIS_NOT)
        return CustomResponse(status="1", message=Messages.CATEGORY_PRICING_STRATEGIS_DELETE)