from datetime import datetime
from uuid import UUID
from sqlalchemy.orm import Session
from fastapi import HTTPException, status
from src.core.exceptions import APIException
from src.utils.pagination import QueryPaginator
from src.apps.wine.producer.models.producer import Producer,ProducerKeyword,ProducerNoise
from sqlalchemy import func, cast, Integer,and_,or_
from src.apps.wine.producer.schemas.producer import ProducerFilterSchema,ProducerCreateSchema,ProducerUpdateSchema,ProducerOutputSchema
from src.utils.constants import API_PREFIXES
from src.apps.wine.producer.schemas.producer_keyword import *


async def create_producer_keyword(
    db: Session,
    producer_keyword: ProducerKeywordAdditionSchema
) -> ProducerKeyword:
    try:
        new_keyword = ProducerKeyword(**producer_keyword.model_dump())
        db.add(new_keyword)
        db.commit()
        db.refresh(new_keyword)
        return ProducerKeywordOutputSchema.model_validate(new_keyword)
    except Exception as e:
        raise APIException(
            module="create_producer_keyword",
            error={"exception": str(e)},
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            message="Error creating producer keyword."
        )
        
async def update_producer_keyword(
    db: Session,
    producer_id: int,
    keyword_data: ProducerKeywordUpdateSchema
) -> ProducerKeyword:
    try:
        keyword = db.query(ProducerKeyword).filter(ProducerKeyword.producer_id == producer_id,ProducerKeyword.deleted_at == None).first()
        if not keyword:
            raise APIException(
                module="update_producer_keyword",
                error={"exception": "Producer keyword not found"},
                status_code=status.HTTP_404_NOT_FOUND,
                message="Producer keyword not found."
            )
        for key, value in keyword_data.model_dump().items():
            if value is not None:
                setattr(keyword, key, value)
        db.commit()
        db.refresh(keyword)
        return ProducerKeywordOutputSchema.model_validate(keyword)
    except Exception as e:
        raise APIException(
            module="update_producer_keyword",
            error={"exception": str(e)},
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            message="Error updating producer keyword."
        )
        
async def get_producer_keyword_by_id(
    db: Session,
    producer_id: int
) -> ProducerKeywordOutputSchema:
    try:
        keyword = db.query(ProducerKeyword).filter(ProducerKeyword.producer_id == producer_id, ProducerKeyword.deleted_at == None).first()
        if not keyword:
            raise APIException(
                module="get_producer_keyword_by_id",
                error={"exception": "Producer keyword not found"},
                status_code=status.HTTP_404_NOT_FOUND,
                message="Producer keyword not found."
            )
        return ProducerKeywordOutputSchema.model_validate(keyword)
    except Exception as e:
        raise APIException(
            module="get_producer_keyword_by_id",
            error={"exception": str(e)},
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            message="Failed to fetch producer keyword."
        )