from __future__ import annotations

from fastapi import APIRouter, Depends, Query, status

from src.core.deps import get_usuarios_data_service, require_api_key

from .schemas import (
    PaginatedUsuariosData,
    UsuarioDataCreate,
    UsuarioDataOut,
    UsuarioDataUpdate,
)
from .service import UsuariosDataService

router = APIRouter(prefix="/api/v1/usuarios-data", tags=["Usuários - Dados"])


@router.get(
    "",
    summary="Listar dados de usuários",
    response_model=PaginatedUsuariosData,
    response_model_exclude_none=True,
    responses={
        status.HTTP_200_OK: {
            "description": "Lista paginada de dados cadastrais",
            "content": {
                "application/json": {
                    "example": {
                        "items": [
                            {
                                "id": "usuario_data_01",
                                "nome-completo": "Ana Carolina Costa",
                                "nome-social": "Carol Costa",
                                "cpf": "12345678901",
                                "enderecos": ["endereco_01"],
                                "email": "ana.costa@empresa.com",
                                "createdAt": "2025-01-05T10:00:00.000Z",
                                "updatedAt": "2025-01-05T10:00:00.000Z",
                            }
                        ],
                        "total": 1,
                    }
                }
            },
        }
    },
)
async def list_usuarios_data(
    page: int = Query(1, ge=1, description="Página atual (>=1)"),
    limit: int | None = Query(None, ge=1, le=100, description="Itens por página (1-100)"),
    q: str | None = Query(None, description="Busca por nome ou CPF"),
    sort: str | None = Query(
        None,
        description="Campo para ordenação",
        pattern="^(nome-completo|cpf|\\$createdAt)$",
    ),
    order: str | None = Query(None, pattern="^(asc|desc)$", description="Ordem da ordenação"),
    _: None = Depends(require_api_key),
    service: UsuariosDataService = Depends(get_usuarios_data_service),
) -> PaginatedUsuariosData:
    return await service.list(page=page, limit=limit, q=q, sort=sort, order=order)


@router.get(
    "/{usuario_data_id}",
    summary="Detalhar dados de usuário",
    response_model=UsuarioDataOut,
    response_model_exclude_none=True,
    responses={
        status.HTTP_200_OK: {
            "description": "Dados encontrados",
            "content": {
                "application/json": {
                    "example": {
                        "id": "usuario_data_01",
                        "nome-completo": "Ana Carolina Costa",
                        "nome-social": "Carol Costa",
                        "cpf": "12345678901",
                        "enderecos": ["endereco_01"],
                        "email": "ana.costa@empresa.com",
                        "createdAt": "2025-01-05T10:00:00.000Z",
                        "updatedAt": "2025-01-05T10:00:00.000Z",
                    }
                }
            },
        },
        status.HTTP_404_NOT_FOUND: {
            "description": "Dados não encontrados",
            "content": {"application/json": {"example": {"detail": "Dados do usuário não encontrados."}}},
        },
    },
)
async def get_usuario_data(
    usuario_data_id: str,
    _: None = Depends(require_api_key),
    service: UsuariosDataService = Depends(get_usuarios_data_service),
) -> UsuarioDataOut:
    return await service.get(usuario_data_id)


@router.post(
    "",
    summary="Criar dados de usuário",
    status_code=status.HTTP_201_CREATED,
    response_model=UsuarioDataOut,
    response_model_exclude_none=True,
    responses={
        status.HTTP_201_CREATED: {
            "description": "Dados criados",
            "content": {
                "application/json": {
                    "example": {
                        "id": "usuario_data_02",
                        "nome-completo": "Bruno Silva",
                        "nome-social": None,
                        "cpf": "98765432100",
                        "enderecos": [],
                        "email": "bruno.silva@empresa.com",
                        "createdAt": "2025-02-10T09:00:00.000Z",
                        "updatedAt": "2025-02-10T09:00:00.000Z",
                    }
                }
            },
        }
    },
)
async def create_usuario_data(
    body: UsuarioDataCreate,
    _: None = Depends(require_api_key),
    service: UsuariosDataService = Depends(get_usuarios_data_service),
) -> UsuarioDataOut:
    return await service.create(body)


@router.put(
    "/{usuario_data_id}",
    summary="Atualizar dados de usuário",
    response_model=UsuarioDataOut,
    response_model_exclude_none=True,
    responses={
        status.HTTP_200_OK: {
            "description": "Dados atualizados",
            "content": {
                "application/json": {
                    "example": {
                        "id": "usuario_data_01",
                        "nome-completo": "Ana C. Costa",
                        "nome-social": "Carol",
                        "cpf": "12345678901",
                        "enderecos": ["endereco_01", "endereco_03"],
                        "email": "ana.costa@empresa.com",
                        "createdAt": "2025-01-05T10:00:00.000Z",
                        "updatedAt": "2025-03-01T12:00:00.000Z",
                    }
                }
            },
        },
        status.HTTP_404_NOT_FOUND: {
            "description": "Dados não encontrados",
            "content": {"application/json": {"example": {"detail": "Dados do usuário não encontrados."}}},
        },
    },
)
async def update_usuario_data(
    usuario_data_id: str,
    body: UsuarioDataUpdate,
    _: None = Depends(require_api_key),
    service: UsuariosDataService = Depends(get_usuarios_data_service),
) -> UsuarioDataOut:
    return await service.update(usuario_data_id, body)


@router.delete(
    "/{usuario_data_id}",
    status_code=status.HTTP_204_NO_CONTENT,
    summary="Remover dados de usuário",
)
async def delete_usuario_data(
    usuario_data_id: str,
    _: None = Depends(require_api_key),
    service: UsuariosDataService = Depends(get_usuarios_data_service),
) -> None:
    await service.delete(usuario_data_id)
