
from fastapi import HTTPException
from sqlalchemy import func
from app.api.carpentry import schema
from app.dependency.authantication import JWTPayloadSchema
from sqlalchemy.orm import Session
from app.locale.messages import Messages
from app.models.main.carpentry import CarpentryBase, TblCarpentry
from app.utils.schemas_utils import CustomResponse

class CarpentryService:
    def __init__(self, db: Session, token: JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def create_carpentry(self, request: schema.CarpentryCreate):
        total = request.number_of_units * request.cost_per_unit
        request_data = request.model_dump()
        request_data["total"] = total
        created_carpentry = CarpentryBase.model_validate(request_data)
        TblCarpentry.create(created_carpentry, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.CARPENTRY)
    
    async def get_carpentry(self, group_id: int):
        new_get_carpentry = TblCarpentry.get_by_carpentry(group_id, self.db)
        if not new_get_carpentry:
            raise HTTPException(status_code=404, detail="Get group ID not found")
        return [schema.CarpentryResponses.model_validate(get_group) for get_group in new_get_carpentry]
        
    async def get_and_sum_carpentry(self, group_id: int) ->"TblCarpentry":
        new_get_and_sum_carpentry = (
            self.db.query(
                TblCarpentry.group_id,
                TblCarpentry.store_formate_type,
                func.sum(TblCarpentry.total).label("total_sum")
            )
            .filter(TblCarpentry.group_id == group_id)
            .group_by(TblCarpentry.group_id, TblCarpentry.store_formate_type)
            .all()
        )
        if not new_get_and_sum_carpentry:
            raise HTTPException(status_code=404, detail="Get sum ID not found")
        return [schema.CarpentrySums.model_validate(get_and_sum_carpentry) for get_and_sum_carpentry in new_get_and_sum_carpentry]
    
    async def update_carpentry(self, request: schema.CarpentryUpdate):
        total = request.number_of_units * request.cost_per_unit
        request_data = request.model_dump()
        request_data["total"] = total
        updated_carpentry = CarpentryBase.model_validate(request_data)
        if updated_carpentry.carpentry_id is None:
            return CustomResponse(status="-1", message=Messages.CARPENTRY_UPDATE_NOT)
        TblCarpentry.update_carpentry(updated_carpentry.carpentry_id,updated_carpentry,self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.CARPENTRY_UPDATE_SUCCESSFULLY)
        