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.word_alias.models.word_alias import WordAlias
from src.apps.wine.word_alias.schemas.word_alias import WordAliasCreateSchema,WordAliasFilterSchema,WordAliasOutputSchema,WordAliasUpdateSchema,WordAliasSchema
from src.apps.wine.word_alias.schemas.word_change import WordChangeOutputSchema
from src.utils.constants import API_PREFIXES
from src.core.config import settings


async def get_all_word_changes(
    db: Session,
    payload: WordAliasFilterSchema = None,
    page: int = 1,
    per_page: int = 10,
) -> any:
    """Retrieve all word changes with optional filtering and pagination."""
    try:
        offset = (page - 1) * per_page

        query = (
            db.query(WordAlias.word, WordAlias.alias)
            .filter(WordAlias.deleted_at.is_(None))
        )

        if payload and payload.type:
            query = query.filter(WordAlias.alias_type == payload.type)

        paginator = QueryPaginator(
            query=query,
            schema=WordChangeOutputSchema,
            url="".join([str(settings.api_base_url()), API_PREFIXES.WORD_CHANGE]),
            offset=offset,
            limit=per_page,
            use_orm=False,
        )

        return paginator.paginate()

    except Exception as e:
        raise APIException(
            module="get_all_word_changes",
            error={"exception": str(e)},
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            message="Error retrieving word changes."
        )
