import logging

from sqlalchemy import text
from typing import Optional
from sqlalchemy.ext.asyncio import AsyncSession

logger = logging.getLogger(__name__)

class AuthCRUD:
    async def get_user_by_email(self, db: AsyncSession, email: str) -> Optional[dict]:
        """Busca usuário por email usando SQL direto"""
        logger.debug(f"Buscando usuário por email: {email}")
        try:
            # Usando text() para compatibilidade com SQL Server
            result = await db.execute(
                text("SELECT * FROM dbo.Usuario WHERE Email = :email"),
                {"email": email}
            )
            row = result.fetchone()
            if row:
                # Converte row para dicionário
                user_dict = dict(row._mapping) if hasattr(row, '_mapping') else dict(row)
                logger.debug(f"Usuário encontrado: Email={email}")
                return user_dict
            else:
                logger.debug(f"Usuário não encontrado para email: {email}")
                return None
        except Exception as e:
            logger.error(f"Erro ao buscar usuário por email: {e}", exc_info=True)
            raise

    async def get_cliente_by_id(self, db: AsyncSession, id_cliente: int) -> Optional[dict]:
        """Busca cliente por ID usando SQL direto"""
        logger.debug(f"Buscando cliente por ID: {id_cliente}")
        try:
            # Usando text() para compatibilidade com SQL Server
            result = await db.execute(
                text("SELECT * FROM dbo.Cliente WHERE Id = :id_cliente"),
                {"id_cliente": id_cliente}
            )
            row = result.fetchone()
            if row:
                # Converte row para dicionário
                cliente_dict = dict(row._mapping) if hasattr(row, '_mapping') else dict(row)
                logger.debug(f"Cliente encontrado: Id={id_cliente}")
                return cliente_dict
            else:
                logger.debug(f"Cliente não encontrado para ID: {id_cliente}")
                return None
        except Exception as e:
            logger.error(f"Erro ao buscar cliente por ID: {e}", exc_info=True)
            raise

    async def get_cliente_by_token(self, db: AsyncSession, token: str) -> Optional[dict]:
        """Busca cliente por token usando SQL direto"""
        logger.debug(f"Buscando cliente por token")
        try:
            # Usando text() para compatibilidade com SQL Server
            result = await db.execute(
                text("SELECT * FROM dbo.Cliente WHERE Token = :token"),
                {"token": token}
            )
            row = result.fetchone()
            if row:
                # Converte row para dicionário
                cliente_dict = dict(row._mapping) if hasattr(row, '_mapping') else dict(row)
                logger.debug(f"Cliente encontrado por token")
                return cliente_dict
            else:
                logger.debug(f"Cliente não encontrado para token fornecido")
                return None
        except Exception as e:
            logger.error(f"Erro ao buscar cliente por token: {e}", exc_info=True)
            raise

crud = AuthCRUD()

