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 sqlalchemy import func, cast, Integer,and_,or_
from src.apps.wine.keyword_substitution.models.keyword_substitution import KeywordSubstitution
from src.apps.wine.keyword_substitution.schemas.keyword_substitution import KeywordSubstitutionCreateSchema,KeywordSubstitutionOutputSchema,KeywordSubstitutionSchema,KeywordSubstitutionFilterSchema,KeywordSubstitutionUpdateSchema
from src.utils.constants import API_PREFIXES
from src.core.config import settings

async def get_all_keyword_substitutions(
    db: Session,
    payload: KeywordSubstitutionFilterSchema = None,
    page: int = 1,
    per_page: int = 10,
) -> any:
    """Retrieve all keyword substitutions with optional filtering. with pagination"""
    try:
        offset = (page - 1) * per_page
        query = db.query(KeywordSubstitution).filter(KeywordSubstitution.deleted_at.is_(None))
        if payload:
            if payload.type:
                query = query.filter(KeywordSubstitution.substitution_type == payload.type)
        paginator = QueryPaginator(
            query=query, schema=KeywordSubstitutionOutputSchema, url="".join([str(settings.api_base_url()), API_PREFIXES.KEYWORD_SUBSTITUTION]), offset=offset, limit=per_page, use_orm=True
        )
        return paginator.paginate()
    except Exception as e:
        raise APIException(
            module="get_all_keyword_substitutions",
            error={"exception": str(e)},
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            message="Error retrieving keyword substitutions."
        ) 