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

class DefineYourPromotionsService():
    def __init__(self, db:Session, token:JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def create_define(self,request:schema.DefineYourPromotionsCreate):
        created_define = DefineYourPromotionsBase.model_validate(request.model_dump())
        TblDefineYourPromotions.create_define(created_define, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.DEFINE_YOUR_PROMOTIONS)
    
    async def get_define(self, group_id:int):
        new_get_dafine = TblDefineYourPromotions.get_define(group_id, self.db)
        if not new_get_dafine:
            raise HTTPException(status_code=404, detail="Get group ID not found")
        return [schema.DefineYourPromotionsResponse.model_validate(get_group) for get_group in new_get_dafine]
    
    async def update_define(self, request:list[schema.DefineYourPromotionsUpdate]):
        for req in request:
            updated_define = DefineYourPromotionsBase.model_validate(req.model_dump())
            if updated_define.define_id is None:
                return CustomResponse(status="-1", message=Messages.DEFINE_YOUR_PROMOTIONS_NOT)
            TblDefineYourPromotions.update_define(updated_define.define_id, updated_define, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.DEFINE_YOUR_PROMOTIONS_UPDATE)
    
    async def delete_define(self, define_id:int):
        deleted_define = TblDefineYourPromotions.delete_define(define_id, self.db)
        if not deleted_define:
            return CustomResponse(status="-1", message=Messages.DEFINE_YOUR_PROMOTIONS_NOT)
        return CustomResponse(status="1", message=Messages.DEFINE_YOUR_PROMOTIONS_DELETE)