from typing import List
from fastapi import HTTPException
from sqlalchemy.orm import Session
from sqlalchemy import func
from app.api.electrical_cabling import schema
from app.dependency.authantication import JWTPayloadSchema
from app.locale.messages import Messages
from app.models.main.electrical_cabling import ElectricalCablingBase, TblElectricalCabling
from app.utils.schemas_utils import CustomResponse

class ElectricalCablingService:
    def __init__(self, db:Session, token:JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def create_electrical_cabling(self, request:List[schema.ElectricalCablingCreate]):
        created_electrical_cabling = []
        for item in request:
            total = item.number_tonnes * item.cost_unit
            requestd_data = item.model_dump()
            requestd_data["total"] = total
            data = ElectricalCablingBase.model_validate(requestd_data)
            sale = TblElectricalCabling.create_electrical_cabling(data, self.db)
            created_electrical_cabling.append(sale)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.ELECTRICAL_CABLING)
        
    async def get_electrical_cabling1(self, group_id:int):
        new_get_electrical_cabling = TblElectricalCabling.get_electrical_cabling(group_id, self.db)
        if not new_get_electrical_cabling:
            raise HTTPException(status_code=404, detail="Get group ID not found")
        return [schema.ElectricalCablingResponse.model_validate(get_group) for get_group in new_get_electrical_cabling]
    
    async def get_sum_electrical(self, group_id:int) ->"TblElectricalCabling":
        new_get_sum_electrical = (
            self.db.query(
                TblElectricalCabling.group_id,
                TblElectricalCabling.store_format_type,
                func.sum(TblElectricalCabling.total).label("total_sum")
            )
            .filter(TblElectricalCabling.group_id == group_id)
            .group_by(TblElectricalCabling.group_id, TblElectricalCabling.store_format_type)
            .all()
        )
        if not new_get_sum_electrical:
            raise HTTPException(status_code=404, detail="Get sum ID not found")
        return [schema.ElectricalCablingSum.model_validate(get_sum_group) for get_sum_group in new_get_sum_electrical]
    
    async def update_elecctrical_cabling(self, request:List[schema.ElectricalCablingUpdate]):
        for req in request:
            updated_elecctrical_cabling = ElectricalCablingBase.model_validate(req.model_dump())
            if updated_elecctrical_cabling.electrical_id is None:
                return CustomResponse(status="-1", message=Messages.ELECTRICAL_CABLING_NOT)
            TblElectricalCabling.update_electrical_cabling(updated_elecctrical_cabling.electrical_id, updated_elecctrical_cabling, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.ELECTRICAL_CABLING_UPDATE)
    
    async def delete_elecctrical_cabling(self, electrical_id:int):
        deleted_elecctrical_cabling = TblElectricalCabling.delete_electrical_cabling(electrical_id, self.db)
        if not deleted_elecctrical_cabling:
            return CustomResponse(status="-1", message=Messages.ELECTRICAL_CABLING_NOT)
        return CustomResponse(status="1", message=Messages.ELECTRICAL_CABLING_DELETE)