import logging

from typing import Optional
from core.auth import require_fix_token
from core.database import get_sqlserver_db
from sqlalchemy.ext.asyncio import AsyncSession
from schemas.alerta_cliente import ClienteResponse
from services.alerta_cliente import ClienteService
from fastapi import APIRouter, Depends, Query, status
from core.api_responses import build_success_payload, to_schema_dict, SuccessResponse, ErrorResponse

logger = logging.getLogger(__name__)

router = APIRouter(
    prefix="/clientes-alerta-fiscal",
    tags=["Alerta Fiscal - Cadastro Clientes Alerta Fiscal"],
)

@router.get(
    "/buscar",
    summary="Listar clientes do cadastro interno do sistema Alerta Fiscal",
    description="""
Consulta a tabela **dbo.Cliente** no banco de dados **SQL Server** - cadastro interno do sistema Alerta Fiscal.

**⚠️ IMPORTANTE - DIFERENÇA ENTRE ROTAS:**

Esta rota lista os **clientes do cadastro interno do sistema Alerta Fiscal**, diferente da rota `/clientes-omie` que consulta os clientes cadastrados na Omie.

**Comparação:**
- **Esta rota (`/clientes-alerta-fiscal/buscar`)**: Consulta `dbo.Cliente` no **SQL Server** - cadastro interno do sistema Alerta Fiscal
- **Rota `/clientes-omie`**: Consulta `omie_cliente` no **MySQL (DataLake)** - dados da Omie

**Tabela:** `dbo.Cliente` (SQL Server)

**Parâmetros (query):**
- `cnpj` (opcional): Se fornecido, filtra clientes por CNPJ (busca parcial). Se não fornecido, retorna TODOS os clientes.

**Exemplos:**

1. **Buscar TODOS os clientes do Alerta Fiscal (sem filtros):**
```bash
curl -X GET 'http://localhost:8000/clientes-alerta-fiscal/buscar' \
  -H 'Authorization: Bearer <TOKEN>'
```

2. **Buscar clientes do Alerta Fiscal por CNPJ (com filtro opcional):**
```bash
curl -X GET 'http://localhost:8000/clientes-alerta-fiscal/buscar?cnpj=12345678000190' \
  -H 'Authorization: Bearer <TOKEN>'
```

**SQL Base:**
```sql
SELECT * FROM dbo.Cliente
WHERE (Cnpj LIKE '%{cnpj}%' OR :cnpj IS NULL)
```

**Nota:** O parâmetro `cnpj` é completamente opcional. Se não for passado, a API retornará todos os clientes cadastrados no sistema Alerta Fiscal.
""",
    response_model=SuccessResponse,
    responses={
        200: {"description": "Lista de clientes"},
        401: {"description": "Credenciais inválidas ou ausentes", "model": ErrorResponse},
        500: {"description": "Erro interno", "model": ErrorResponse},
    },
    openapi_extra={
        "responses": {
            "200": {
                "content": {
                    "application/json": {
                        "example": {
                            "message": "2 clientes encontrados",
                            "data": [
                                {
                                    "Token": "token123",
                                    "Cnpj": "12.345.678/0001-90",
                                    "RazaoSocial": "Empresa Exemplo Ltda",
                                    "NomeFantasia": "Empresa Exemplo"
                                }
                            ],
                            "timestamp": "2025-01-01T12:00:00Z"
                        }
                    }
                }
            }
        }
    }
)
async def listar_clientes(
    cnpj: Optional[str] = Query(
        None, 
        description="Filtrar por CNPJ (busca parcial). OPCIONAL: se não informado, retorna todos os clientes.", 
        example="12345678000190"
    ),
    _: None = Depends(require_fix_token),
    db: AsyncSession = Depends(get_sqlserver_db),
):
    logger.info(f"Iniciando busca de clientes Alerta Fiscal - CNPJ filtro: {cnpj if cnpj else 'Nenhum (todos)'}")
    
    try:
        logger.debug("Chamando ClienteService.listar...")
        items = await ClienteService.listar(db, cnpj=cnpj)
        logger.debug(f"ClienteService.listar retornou {len(items)} itens (Alerta Fiscal)")
        
        logger.debug("Convertendo itens para schema...")
        data = []
        for idx, item in enumerate(items):
            try:
                converted = to_schema_dict(ClienteResponse, item)
                data.append(converted)
            except Exception as e:
                item_dict = {}
                try:
                    if hasattr(item, '__dict__'):
                        item_dict = {k: (type(v).__name__, v) for k, v in item.__dict__.items() if not k.startswith('_sa_')}
                except:
                    pass
                
                logger.error(
                    f"❌ Erro ao converter item {idx} para schema:\n"
                    f"   Erro: {e}\n"
                    f"   Tipos dos campos do item: {item_dict}"
                )
                raise
        
        qtd = len(data)
        logger.debug(f"Conversão concluída: {qtd} itens processados")
        
        filtros = []
        if cnpj:
            filtros.append(f"CNPJ contendo '{cnpj}'")
        
        sufixo = f" com filtros: {', '.join(filtros)}" if filtros else ""
        if qtd == 0:
            message = f"Nenhum cliente do Alerta Fiscal encontrado{sufixo}"
        elif qtd == 1:
            message = f"1 cliente do Alerta Fiscal encontrado{sufixo}"
        else:
            message = f"{qtd} clientes do Alerta Fiscal encontrados{sufixo}"
        
        logger.info(f"Busca concluída com sucesso: {message}")
        return build_success_payload(data=data, message=message)
    
    except Exception as e:
        logger.error(f"Erro ao listar clientes Alerta Fiscal: {e}", exc_info=True)
        raise

