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

class SalesEstimateService:
    def __init__(self, db:Session, token:JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def create_sales_estimate(self, request:schema.SalesEstimateCreate):
        created_sales_estimate = SalesEstimateBase.model_validate(request.model_dump())
        TblSalesEstimate.create_sales_estimate(created_sales_estimate, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.SALES_ESTIMATE)
    
    async def get_sales_estimate(self, sales_get_id:int):
        new_get_sales_estimate = TblSalesEstimate.get_sales_estimate(sales_get_id, self.db)
        if not new_get_sales_estimate:
            raise HTTPException(status_code=404, detail="Get Sales Estimate ID not found")
        return schema.SalesEstimateResponse.model_validate(new_get_sales_estimate)
    
    async def get_group_sales_estimate(self, group_id) ->"TblSalesEstimate":
        new_get_group_sales_estimate = self.db.query(TblSalesEstimate).filter(TblSalesEstimate.group_id == group_id).all()
        if not new_get_group_sales_estimate:
            raise HTTPException(status_code=404, detail="Get group ID not found")
        return [schema.SalesEstimateResponse.model_validate(get_group) for get_group in new_get_group_sales_estimate]
    
    async def get_sales_value_sales_estimate(self, group_id:int) ->"TblSalesEstimate":
        new_get_sales_value_sales_estimate = (
            self.db.query (func.exp(func.sum(func.ln(TblSalesEstimate.value))).label("sales_value"))
            # self.db.query(
            #     TblSalesEstimate.parameter,
            #     func.mult(TblSalesEstimate.value ).label("sales_value")
            # )
            .filter(
                TblSalesEstimate.parameter.in_([
                    "Number of Bills per Month",
                    "Number of Items per Bill",
                    "Average Price per item (in Rupees)"
                ]),
                TblSalesEstimate.group_id == group_id
            )
            .scalar()
            # .group_by(TblSalesEstimate.parameter)
            # .all()
        )
        if  not new_get_sales_value_sales_estimate:
            raise HTTPException(status_code=404, detail="Get Multiple ID not found")
        # return [schema.SalesEstimateSum.model_validate(get_multiple) for get_multiple in new_get_sales_value_sales_estimate]
        return new_get_sales_value_sales_estimate

        # new_get_sales_value_sales_estimate = (
        #     self.db.query(
        #         TblSalesEstimate.parameter.in_([
        #             "Number of Bills per Month",
        #             "Number of Items per Bill",
        #             "Average Price per item (in Rupees)"
        #         ])
        #     )
        # )
    
    async def update_sales_estimate(self, request:schema.SalesEstimateUpdate):
        updated_sales_estimate = SalesEstimateBase.model_validate(request.model_dump())
        if updated_sales_estimate.sales_id is None:
            return CustomResponse(status="-1", message=Messages.SALES_ESTIMATE_NOT)
        TblSalesEstimate.update_sales_estimate(updated_sales_estimate.sales_id, updated_sales_estimate, self.db)
        self.db.commit()
        return CustomResponse(status="1" , message=Messages.SALES_ESTIMATE_UPDATE)
    
    async def delete_sales_estimate(self, group_id:int):
        deleted_sales_estimate = TblSalesEstimate.delete_sales_estimate(group_id, self.db)
        if not deleted_sales_estimate:
            return CustomResponse(status="-1", message=Messages.SALES_ESTIMATE_NOT)
        return CustomResponse(status="1", message=Messages.SALES_ESTIMATE_DELETE)