from app.api.shrinkage_areas_reasons import schema
from app.models.main.shrinkage_areas_reasons import ShrinkageAreasReasonsBase, TblShrinkageAreasReasons
from app.utils.schemas_utils import CustomResponse
from sqlalchemy.orm import Session
from app.dependency.authantication import JWTPayloadSchema
from app.locale.messages import Messages
from fastapi import HTTPException

class ShrinkageAreasReasonsService:
    def __init__(self, db:Session, token:JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def create_shrinkage_areas_reasons(self, request:schema.ShrinkageAreasReasonsCreate):
        created_shrinkage_areas_reasons = ShrinkageAreasReasonsBase.model_validate(request.model_dump())
        TblShrinkageAreasReasons.create_shrinkage_areas_reasons(created_shrinkage_areas_reasons, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.SHRINNKAGE_AREAS_REASONS)
    
    async def get_shrinkage_areas_reasons(self, group_id:int):
        new_get_shrinkage_areas_reasons = TblShrinkageAreasReasons.get_shrinkage_areas_reasons(group_id, self.db)
        if not new_get_shrinkage_areas_reasons:
            raise HTTPException(status_code=404, detail="Get group ID not found")
        return [schema.ShrinkageAreasReasonsResponse.model_validate(get_group) for get_group in new_get_shrinkage_areas_reasons]
    
    async def update_shrinkage_areas_reasons(self, request:schema.ShrinkageAreasReasonsUpdate):
        updated_shrinkage_areas_reasons = ShrinkageAreasReasonsBase.model_validate(request.model_dump())
        if updated_shrinkage_areas_reasons.shrinkage_id is None:
            return CustomResponse(status="-1", message=Messages.SHRINNKAGE_AREAS_REASONS_NOT)
        TblShrinkageAreasReasons.update_shrinkage_areas_reasons(updated_shrinkage_areas_reasons.shrinkage_id, updated_shrinkage_areas_reasons, self.db)
        return CustomResponse(status="1", message=Messages.SHRINNKAGE_AREAS_REASONS_UPDATE)
    
    async def delete_shrinkage_areas_reasons(self, group_id:list[int]):
        deleted_shrinkage_areas_reasons = TblShrinkageAreasReasons.delete_shrinkage_areas_reasons(group_id, self.db)
        if not deleted_shrinkage_areas_reasons:
            return CustomResponse("-1", message=Messages.SHRINNKAGE_AREAS_REASONS_NOT)
        return CustomResponse(status="1", message=Messages.SHRINNKAGE_AREAS_REASONS_DELETE)