from typing import List
from fastapi import HTTPException
from sqlalchemy.orm import Session
from app.api.competitor_pricing_analysis import schema
from app.dependency.authantication import JWTPayloadSchema
from app.locale.messages import Messages
from app.models.main.competitor_pricing_analysis import CompetitorPricingAnalysisBase, TblCompetitorPricingAnalysis
from app.utils.schemas_utils import CustomResponse

class CompetitorPricingAnalysisService:
    def __init__(self, db:Session, token:JWTPayloadSchema):
        self.db = db
        self.token = token
    
    async def create_competitor_pricing_analysis(self, request:schema.CompetitorPricingAnalysisCreate):
        created_competitor_pricing_analysis = CompetitorPricingAnalysisBase.model_validate(request.model_dump())
        TblCompetitorPricingAnalysis.create_competitor_pricing_analysis(created_competitor_pricing_analysis, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.COMPETITOR_PRICING_ANALYSIS)
    
    async def  get_competitor_pricing_analysis(self, competitor_get_id:int):
        new_get_competitor_pricing_analysis = TblCompetitorPricingAnalysis.get_competitor_pricing_analysis(competitor_get_id, self.db)
        if not new_get_competitor_pricing_analysis:
            raise HTTPException(status_code=404, detail="Get ID not found")
        return schema.CompetitorPricingAnalysisResponse.model_validate(new_get_competitor_pricing_analysis)
    
    async def get_group_competitor_pricing_analysis(self, group_id:int) ->"TblCompetitorPricingAnalysis":
        new_get_group_competitor_pricing_analysis = self.db.query(TblCompetitorPricingAnalysis).filter(TblCompetitorPricingAnalysis.group_id == group_id).all()
        if not new_get_group_competitor_pricing_analysis:
            raise HTTPException(status_code=404, detail="Get Group ID not found")
        return [schema.CompetitorPricingAnalysisResponse.model_validate(get_group) for get_group in new_get_group_competitor_pricing_analysis]
    
    async def update_competitor_pricing_analysis(self, request:List[schema.CompetitorPricingAnalysisUpdate]):
        for req in request:
            updated_competitor_pricing_analysis = CompetitorPricingAnalysisBase.model_validate(req.model_dump())
            if updated_competitor_pricing_analysis.competitor_id is None:
                return CustomResponse(status="-1", message=Messages.COMPETITOR_PRICING_ANALYSIS_NOT)
            TblCompetitorPricingAnalysis.update_competitor_pricing_analysis(updated_competitor_pricing_analysis.competitor_id, updated_competitor_pricing_analysis, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.COMPETITOR_PRICING_ANALYSIS_UPDATE)
    
    async def delete_competitor_pricing_analysis(self, competitor_id:int):
        deleted_competitor_pricing_analysis = TblCompetitorPricingAnalysis.delete_competitor_pricing_analysis(competitor_id, self.db)
        if not deleted_competitor_pricing_analysis:
            return CustomResponse(status="-1", message=Messages.COMPETITOR_PRICING_ANALYSIS_NOT)
        return CustomResponse(status="1", message=Messages.COMPETITOR_PRICING_ANALYSIS_DELETE)
    
    