from typing import List
from fastapi import HTTPException
from sqlalchemy.orm import Session
from app.api.addtional_installation_fix import schema
from app.dependency.authantication import JWTPayloadSchema
from app.locale.messages import Messages
from app.models.main.additional_installations_fix import AdditionalInstallationBase, TblAdditionalInstallation
from app.utils.schemas_utils import CustomResponse

class AdditionalInstallationService:
    def __init__(self, db:Session, token:JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def create_additional_installation(self, request:List[schema.AdditionalInstallationCreate]):
        created_aditional_installation = []
        for item in request:
            sale = TblAdditionalInstallation.create_additional_installation(item, self.db)
            created_aditional_installation.append(sale)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.ADDITIONAL_INSTALLATION)
    
    async def get_additional_installation(self, additional_get_id:int):
        new_get_additional_installation = TblAdditionalInstallation.get_additional_installation(additional_get_id, self.db)
        if not new_get_additional_installation:
            raise HTTPException(status_code=404, detail="Get Additional Installation ID not found")
        return schema.AdditionalInstallationResponse.model_validate(new_get_additional_installation)
    
    async def get_group_additional_installation(self, group_id:int) ->"TblAdditionalInstallation":
        new_get_group_additional_installation = self.db.query(TblAdditionalInstallation).filter(TblAdditionalInstallation.group_id == group_id).all()
        if not new_get_group_additional_installation:
            raise HTTPException(status_code=404, detail="Get Group ID not found")
        return [schema.AdditionalInstallationResponse.model_validate(get_group) for get_group in new_get_group_additional_installation]
    
    async def update_additional_installation(self, request:schema.AdditionalInstallationUpdate):
        updated_additional_installation = AdditionalInstallationBase.model_validate(request.model_dump())
        if updated_additional_installation.additional_id is None:
            return CustomResponse(status="-1", message=Messages.ADDITIONAL_INSTALLATION_NOT)
        TblAdditionalInstallation.update_additional_installation(updated_additional_installation.additional_id, updated_additional_installation, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.ADDITIONAL_INSTALLATION_UPDATE)
    
    async def delete_additional_installation(self, group_id:int):
        deleted_additional_installation = TblAdditionalInstallation.delete_additional_installation(group_id, self.db)
        if not deleted_additional_installation:
            return CustomResponse(status="-1", message=Messages.ADDITIONAL_INSTALLATION_NOT)
        return CustomResponse(status="1", message=Messages.ADDITIONAL_INSTALLATION_DELETE)
    