from pydantic_core import SchemaError
from sqlalchemy.orm import Session
from fastapi import HTTPException
from app.api.consumer_preferences_research import schema
from app.dependency.authantication import JWTPayloadSchema
from app.locale.messages import Messages
from app.models.main.consumer_preferences_research import ConsumerPreferencesResearchBase, TblConsumerPreferencesResearch
from app.utils.schemas_utils import CustomResponse

class ConsumerReferencesResearchService:
    def __init__(self, db:Session, token:JWTPayloadSchema):
        self.db = db
        self.token = token
        
    async def create_consumer_references_research(self, request:schema.ConsumerPreferencesResearchCreate):
        created_consumer_references_research = ConsumerPreferencesResearchBase.model_validate(request.model_dump())
        TblConsumerPreferencesResearch.create(created_consumer_references_research, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.CONSUMER_PREFERENCES_RESEARCH)
    
    async def get_consumer_preferences_research(self, consumer_get_id:int):
        new_get_consumer_preferences_research = TblConsumerPreferencesResearch.get_consumer_preferences_research(consumer_get_id, self.db)
        if not new_get_consumer_preferences_research:
            raise HTTPException(status_code=404, detail="Get Consumer ID not found")
        return schema.ConsumerPreferencesResearchresponse.model_validate(new_get_consumer_preferences_research)
    
    async def get_group_consumer_preferences_research(self, group_id:int) ->"TblConsumerPreferencesResearch":
        new_get_group_consumer_preferences_research = self.db.query(TblConsumerPreferencesResearch).filter(TblConsumerPreferencesResearch.group_id == group_id).all()
        if not new_get_group_consumer_preferences_research:
            raise HTTPException(status_code=404, detail="Get Consumer ID not found")
        return [schema.ConsumerPreferencesResearchresponse.model_validate(grt_group_data) for grt_group_data in new_get_group_consumer_preferences_research]

    async def update_consumer_preferences_research(self, request:schema.ConsumerPreferencesResearchUpdate):
        updated_consumer_preferences_research = ConsumerPreferencesResearchBase.model_validate(request.model_dump())
        if updated_consumer_preferences_research.consumer_id is None:
            return CustomResponse(status="-1", message=Messages.CONSUMER_PREFERENCES_RESEARCH_NOT)
        TblConsumerPreferencesResearch.update_consumer_preferences_research(updated_consumer_preferences_research.consumer_id, updated_consumer_preferences_research, self.db)
        self.db.commit()
        return CustomResponse(status="1", message=Messages.CONSUMER_PREFERENCES_RESEARCH_UPDATE)
    
    async def delete_consumer_preferences_research(self, group_id:int):
        deleted_consumer_preferences_research = TblConsumerPreferencesResearch.delete_consumer_preferences_research(group_id, self.db)
        if not deleted_consumer_preferences_research:
            return CustomResponse(status="-1", message=Messages.CONSUMER_PREFERENCES_RESEARCH_NOT)
        return CustomResponse(status="1", message=Messages.CONSUMER_PREFERENCES_RESEARCH_DELETE)