import logging

from sqlalchemy import select
from typing import Optional, List
from models.alerta_cliente import Cliente
from sqlalchemy.ext.asyncio import AsyncSession

logger = logging.getLogger(__name__)

class ClienteCRUD:
    async def get_by_cnpj(self, db: AsyncSession, cnpj: str) -> Optional[Cliente]:
        """Busca cliente por CNPJ exato"""
        result = await db.execute(select(Cliente).where(Cliente.Cnpj == cnpj))
        return result.scalar_one_or_none()

    async def list(
        self,
        db: AsyncSession,
        *,
        cnpj: Optional[str] = None,
    ) -> List[Cliente]:
        """Lista clientes com filtro opcional por CNPJ"""
        table_name = f"{Cliente.__table_args__['schema']}.{Cliente.__tablename__}" if Cliente.__table_args__ else Cliente.__tablename__
        logger.info(f"ClienteCRUD.list chamado - Tabela: {table_name} - CNPJ: {cnpj if cnpj else 'Nenhum (todos)'}")
        try:
            logger.debug("Construindo query SELECT...")
            stmt = select(Cliente)
            
            if cnpj:
                logger.debug(f"Aplicando filtro por CNPJ: {cnpj}")
                cnpj_limpo = cnpj.replace('.', '').replace('/', '').replace('-', '').strip()
                logger.debug(f"CNPJ limpo: {cnpj_limpo}")
                stmt = stmt.where(
                    (Cliente.Cnpj.like(f"%{cnpj_limpo}%")) |
                    (Cliente.Cnpj.like(f"%{cnpj}%"))
                )
            else:
                logger.debug("Nenhum filtro aplicado - buscando todos os clientes")
            
            logger.info(f"Executando query na tabela {table_name}...")
            result = await db.execute(stmt)
            logger.debug("Query executada com sucesso")
            
            clientes = list(result.scalars().all())
            logger.info(f"Query retornou {len(clientes)} clientes da tabela {table_name}")
            return clientes
            
        except Exception as e:
            error_msg = str(e)
            if "Invalid object name" in error_msg or "42S02" in error_msg:
                logger.error(
                    f"❌ ERRO: Tabela não encontrada!\n"
                    f"   Tabela esperada: {table_name}\n"
                    f"   Verifique se a tabela existe no banco de dados SQL Server.\n"
                    f"   Erro completo: {error_msg}"
                )
            else:
                logger.error(f"Erro em ClienteCRUD.list ao consultar {table_name}: {e}", exc_info=True)
            raise

crud = ClienteCRUD()

