import logging
from typing import Optional
from core.auth import require_fix_token
from core.database import get_mysql_db
from sqlalchemy.ext.asyncio import AsyncSession
from schemas.omie_cliente import OmieClienteResponse
from services.omie_cliente import OmieClienteService
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-omie",
    tags=["Omie - Cadastro Clientes Omie"],
)

@router.get(
    "",
    summary="Listar clientes cadastrados na Omie",
    description="""
Consulta a tabela **omie_cliente** no banco de dados **MySQL (DataLake)**.

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

Esta rota lista os **clientes cadastrados na Omie**, diferente da rota `/clientes-alerta-fiscal/buscar` que pertence ao **cadastro interno do sistema Alerta Fiscal**.

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

**Tabela:** `omie_cliente` (MySQL)

**Filtros suportados (todos opcionais):**
- `cnpj`: Filtra por CNPJ (busca parcial). Se não fornecido, retorna TODOS os clientes.

**Exemplos:**

1. **Buscar TODOS os clientes da Omie (sem filtros):**
```bash
curl -X GET 'http://localhost:8000/clientes-omie' \
  -H 'Authorization: Bearer <TOKEN>'
```

2. **Buscar clientes da Omie por CNPJ (com filtro opcional):**
```bash
curl -X GET 'http://localhost:8000/clientes-omie?cnpj=12345678000190' \
  -H 'Authorization: Bearer <TOKEN>'
```

**SQL Base:**
```sql
SELECT * FROM omie_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 na Omie.
""",
    response_model=SuccessResponse,
    responses={
        200: {"description": "Lista de clientes da Omie"},
        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": [
                                {
                                    "id": 1,
                                    "cnpj": "12.345.678/0001-90",
                                    "razao_social": "Empresa Exemplo Ltda",
                                    "nome_fantasia": "Empresa Exemplo"
                                }
                            ],
                            "timestamp": "2025-01-01T12:00:00Z"
                        }
                    }
                }
            }
        }
    }
)
async def listar_clientes_omie(
    cnpj: Optional[str] = Query(
        None, 
        description="Filtrar por CNPJ (busca parcial). OPCIONAL: se não informado, retorna todos os clientes da Omie.", 
        example="12345678000190"
    ),
    _: None = Depends(require_fix_token),
    db: AsyncSession = Depends(get_mysql_db),
):
    logger.info(f"Iniciando busca de clientes Omie - CNPJ filtro: {cnpj if cnpj else 'Nenhum (todos)'}")
    
    try:
        logger.debug("Chamando OmieClienteService.listar...")
        items = await OmieClienteService.listar(db, cnpj=cnpj)
        logger.debug(f"OmieClienteService.listar retornou {len(items)} itens")
        
        logger.debug("Convertendo itens para schema...")
        data = []
        for idx, item in enumerate(items):
            try:
                converted = to_schema_dict(OmieClienteResponse, 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 da Omie encontrado{sufixo}"
        elif qtd == 1:
            message = f"1 cliente da Omie encontrado{sufixo}"
        else:
            message = f"{qtd} clientes da Omie 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 Omie: {e}", exc_info=True)
        raise

