
from typing import List
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: List[schema.CarpentryCreate]):
        created_carpentry = []
        for item in request:
            total = item.number_of_units * item.cost_per_unit
            request_data = item.model_dump()
            request_data["total"] = total
            created_item = CarpentryBase.model_validate(request_data)
            sale = TblCarpentry.create(created_item, self.db)
            created_carpentry.append(sale)
        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_format_type,
                func.sum(TblCarpentry.total).label("total_sum")
            )
            .filter(TblCarpentry.group_id == group_id)
            .group_by(TblCarpentry.group_id, TblCarpentry.store_format_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: List[schema.CarpentryUpdate]):
        for req in request:
            total = req.number_of_units * req.cost_per_unit
            request_data = req.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)
    
    async def delete_carpentry(self, carpentry_id:int):
        deleted_carpentry = TblCarpentry.delete_carpentry(carpentry_id, self.db)
        if not deleted_carpentry:
            return CustomResponse(status="-1", message=Messages.CARPENTRY_UPDATE_NOT)
        return CustomResponse(status="1", message=Messages.CARPENTRY_DELETE)
        