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.models.main.store_formate import TblStoreFormat
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:
    #         if item.feature_type == "HVAC":
    #             total = item.number_tonnes * item.cost_unit
    #         elif item.feature_type == "Lighting":
    #             total = item.cost_unit * TblStoreFormat.store_size
    #         elif item.feature_type == "Cabling":
    #             total = item.cost_unit * TblStoreFormat.store_size
    #         elif item.choice == "Unit Price":
    #             total = item.cost_unit * item.havs_rate_unit
    #         elif item.choice == "Rate per SQFT":
    #             total = item.cost_unit * TblStoreFormat.store_size
    #         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 create_electrical_cabling(self, request: List[schema.ElectricalCablingCreate]):

        created_electrical_cabling = []

        for item in request:
            row = (
                self.db.query(TblStoreFormat)
                .filter(TblStoreFormat.group_id == item.group_id)
                .first()
            )

            if row is None:
                raise HTTPException(
                    status_code=400,
                    detail=f"store_size not found for group_id {item.group_id}"
                )

            store_size = row.store_size
            if item.feature_type == "HVAC":
                total = item.number_tonnes * item.cost_unit

            elif item.feature_type in ["Lighting", "Cabling"]:
                total = item.cost_unit * store_size

            elif item.choice == "Unit Price":
                total = item.cost_unit * item.havs_rate_unit

            elif item.choice == "Rate per SQFT":
                total = item.rate_unit * store_size

            else:
                raise HTTPException(
                    status_code=400,
                    detail=f"Unknown feature_type or choice for item: {item}"
                )
            request_data = item.model_dump()
            request_data["total"] = float(total)

            data = ElectricalCablingBase.model_validate(request_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 create_electrical_cabling(self, request: List[schema.ElectricalCablingCreate]):

    #     created_electrical_cabling = []

    #     for item in request:
    #         store_size = (
    #             self.db.query(TblStoreFormat.store_size)
    #             .filter(TblStoreFormat.group_id == item.group_id)
    #             .scalar()
    #         )
    #         if store_size is None:
    #             raise HTTPException(
    #                 status_code=400,
    #                 detail=f"store_size not found for group_id {item.group_id}"
    #             )
    #         if item.feature_type == "HVAC":
    #             total = item.number_tonnes * item.cost_unit

    #         elif item.feature_type in ["Lighting", "Cabling"]:
    #             total = item.cost_unit * store_size

    #         elif item.choice == "Unit Price":
    #             total = item.cost_unit * item.havs_rate_unit

    #         elif item.choice == "Rate per SQFT":
    #             total = item.rate_unit * store_size

    #         else:
    #             raise HTTPException(
    #                 status_code=400,
    #                 detail=f"Unknown feature_type or choice for item: {item}"
    #             )
    #         request_data = item.model_dump()
    #         request_data["total"] = float(total)

    #         data = ElectricalCablingBase.model_validate(request_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)