from typing import Optional
from sqlalchemy import select
from src.core.database import get_db
from src.core.auth import require_front
from src.models.empresas import Empresa
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession
from src.services.empresas import EmpresaService
from src.core.auth import require_enterprise_or_front
from fastapi import APIRouter, Depends, HTTPException, Query, status
from src.schemas.empresas import (
    EnterpriseCreate,
    EnterpriseUpdate,
    EnterpriseResponse,
)
from src.core.api_responses import (
    build_success_payload,
    to_schema_dict,
    SuccessResponse,
    ErrorResponse
)

router = APIRouter(
    prefix="/empresas",
    tags=["Empresas"],
)

@router.get(
    "/buscar",
    summary="Listar empresas",
    description="""
Retorna empresas com filtros opcionais.

Parâmetros (query):
    - id (opcional): filtra por ID exato.
        - nomeFantasia (opcional): filtra por nome fantasia (parcial).

Sem filtros, retorna todas as empresas (escopo permitido pelo token).

Exemplo cURL (sem filtros):

```bash
curl -X GET 'https://api.seu-dominio.com/empresas/buscar' \
  -H 'Authorization: Bearer <TOKEN>'
```

Com filtro por nome fantasia:

```bash
curl -X GET 'https://api.seu-dominio.com/empresas/buscar?nomeFantasia=Acme' \
  -H 'Authorization: Bearer <TOKEN>'
```

Usando X-Enterprise-Token:

```bash
curl -X GET 'https://api.seu-dominio.com/empresas/buscar?nomeFantasia=Acme' \
  -H 'X-Enterprise-Token: <TOKEN_EMPRESA>'
```
""",
    response_model=SuccessResponse,
    responses={
        200: {
            "description": "Lista de empresas"},
        401: {
            "description": "Credenciais inválidas ou ausentes",
            "model": ErrorResponse},
        500: {
            "description": "Erro interno",
            "model": ErrorResponse},
    },
    openapi_extra={
        "responses": {
            "200": {
                "content": {
                    "application/json": {
                        "examples": {
                            "message": "2 empresas encontradas",
                            "data": [
                                {
                                    "id": "id}",
                                    "cnpj": "12.345.678/0001-90",
                                    "razaoSocial": "Acme Ltda",
                                    "nomeFantasia": "Acme",
                                                    "token": "<token>"},
                                {
                                    "id": "2a8b3c4d-5e6f-7a8b-9c0d",
                                    "cnpj": "98.765.432/0001-10",
                                    "razaoSocial": "Beta S/A",
                                    "nomeFantasia": "Beta",
                                                    "token": "<token>"}],
                            "timestamp": "2025-01-01T12:00:00Z",
                        },
                    },
                },
            },
        },
    },
)
async def listar_empresas(
    token: Optional[str] = Query(
        None,
        description="Filtrar por token da empresa",
        examples="abc123...",
    ),
    nomeFantasia: Optional[str] = Query(
        None,
        description="Filtrar por nome fantasia (parcial)",
        examples="Acme",
    ),
    db: AsyncSession = Depends(get_db),
    ctx: dict = Depends(require_enterprise_or_front),
):
    if ctx["type"] == "enterprise":
        token = str(ctx["empresa"].token)
        nomeFantasia = None

    items = await EmpresaService.listar(
        db,
        enterprise_token=token,
        nomeFantasia=nomeFantasia
    )
    data = [to_schema_dict(EnterpriseResponse, x) for x in items]
    qtd = len(data)
    filtros = []
    if token:
        filtros.append(f"token {token[:8]}...")
    if nomeFantasia:
        filtros.append(f"nome fantasia contendo '{nomeFantasia}'")
    sufixo = f" com filtros: {', '.join(filtros)}" if filtros else ""
    if qtd == 0:
        message = f"Nenhuma empresa encontrada{sufixo}"
    elif qtd == 1:
        message = f"1 empresa encontrada{sufixo}"
    else:
        message = f"{qtd} empresas encontradas{sufixo}"
    return build_success_payload(data=data, message=message)

