from typing import List
from fastapi import HTTPException
from sqlalchemy import func
from sqlalchemy.orm import Session
from app.api.visual_merchandising_elements import schema
from app.dependency.authantication import JWTPayloadSchema
from app.locale.messages import Messages
from app.models.main.visual_merchendising_elements import TblVisualMerchElements, VisualMerchElementsBase
from app.utils.schemas_utils import CustomResponse

class VisualMerchElementsService:
    def __init__(self, db:Session, token:JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def create_visual_merch_elements(self, request:schema.VisualMerchElementsCreate):
        total = request.units * request.cost_per_unit
        request_data = request.model_dump()
        request_data["total"] = total
        created_visual_merch_elements = VisualMerchElementsBase.model_validate(request_data)
        TblVisualMerchElements.create(created_visual_merch_elements, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.VISUAL_CREATE)
    
    async def get_visual_merch_elements(self, visual_get_id:int):
        new_get_visual_merch_elements = TblVisualMerchElements.get_visual_merch_elements_data_id(visual_get_id, self.db)
        return schema.VisualMerchElementsResponse.model_validate(new_get_visual_merch_elements)
    
    async def get_group_visual_merch_elements(self, group_id:int) ->"TblVisualMerchElements":
        new_get_group_visual_merch_elements = self.db.query(TblVisualMerchElements).filter(TblVisualMerchElements.group_id == group_id).all()
        if not new_get_group_visual_merch_elements:
            raise HTTPException(status_code=404, detail="Get group ID not found")
        return [schema.VisualMerchElementsResponse.model_validate(get_group) for get_group in new_get_group_visual_merch_elements]
    
    async def get_sum_of_visual_merch_elements(self, group_id:int) ->"TblVisualMerchElements":
        new_get_and_sum_visual_merch_elements = (
            self.db.query(
                TblVisualMerchElements.group_id,
                func.sum(TblVisualMerchElements.total).label("total_sum")
            )
            .filter(TblVisualMerchElements.group_id == group_id)
            .group_by(TblVisualMerchElements.group_id)
            .all()
        )
        if not new_get_and_sum_visual_merch_elements:
            raise HTTPException(status_code=404, detail="Get sum ID not found")
        return [schema.VisualMerchElementsSum.model_validate(get_and_sum_visual_merch_elements) for get_and_sum_visual_merch_elements in new_get_and_sum_visual_merch_elements]
    
    async def update_visual_merch_elements_data(self, request:List[schema.VisualMerchElementsUpdate]):
        for req in request:
            total = req.units * req.cost_per_unit
            request_data = req.model_dump()
            request_data["total"] = total
            updated_visual_merch_elements_data = VisualMerchElementsBase.model_validate(request_data)
            if updated_visual_merch_elements_data.visual_id is None:
                return CustomResponse(status="-1", message=Messages.VISUAL_UPDATE_NOT)
            TblVisualMerchElements.update_visual_merch_elements_id(updated_visual_merch_elements_data.visual_id, updated_visual_merch_elements_data,self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.VISUAL_UPDATE_SUC)
    
    async def delete_visual_merch_elements_data(self, visual_delete_id:int):
        delete_visual_merch_elements = TblVisualMerchElements.delete_visual_merch_elements_id(visual_delete_id,self.db)
        if not delete_visual_merch_elements:
            return CustomResponse(status="1", message=Messages.VISUAL_UPDATE_NOT)
        return CustomResponse(status="1", message=Messages.VISUAL_DELETE_SUC)