from typing import List
from fastapi import HTTPException
from sqlalchemy.orm import Session
from app.api.plumbing import schemas
from app.api.plumbing.schemas import PlumbingResponce, plumbingCreate
from app.dependency.authantication import JWTPayloadSchema
from app.models.main.Plumbing import PlumbingBase, TblPlumbing
from app.utils.schemas_utils import CustomResponse
from app.locale.messages import Messages

class PlumlingService:
    def __init__(self, db: Session, token: JWTPayloadSchema):
        self.db = db
        self.token = token

    async def create_plumbing(self, request: plumbingCreate):

        total=request.units*request.cost_per_unit
        created_plumbing = PlumbingResponce.model_validate(request) 
        created_plumbing.total=total
        new_equipment = TblPlumbing.create(PlumbingBase.model_validate(created_plumbing.model_dump()),self.db)
        self.db.add(new_equipment)
        self.db.commit()
        self.db.refresh(new_equipment)
        return CustomResponse(status="1", message="Plumbing created successfully.")

    async def get_plumbing(self, group_id: int):
        plumbing_record = self.db.query(TblPlumbing).filter(TblPlumbing.group_id == group_id).all()
        if not plumbing_record:
            raise HTTPException(status_code=404,detail="Plumbing Not Found")
        return [PlumbingResponce.model_validate(get_group) for get_group in plumbing_record]
    
    async def updated(self, request:List[schemas.PlumbingUpdate]):
        for req in request:
            total=req.units*req.cost_per_unit
            updated_data = PlumbingBase.model_validate(req.model_dump())
            updated_data.total=total
            if updated_data.plumb_id is None:
                return CustomResponse(status="-1", message=Messages.PLAMBING_NOT)
            TblPlumbing.update(updated_data.plumb_id, updated_data, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.PLAMBING_UPDATE)
    
    async def deleted(self, plumb_id:int):
        deleted_data = TblPlumbing.delete(plumb_id, self.db)
        if not deleted_data:
            return CustomResponse(status="-1", message=Messages.PLAMBING_NOT)
        return CustomResponse(status="1", message=Messages.PLAMBING_DELETE)