from __future__ import annotations

from fastapi import APIRouter, Depends, Query, status

from src.core.deps import get_empresas_socios_service, require_api_key

from .schemas import (
    EmpresasSociosCreate,
    EmpresasSociosOut,
    EmpresasSociosUpdate,
    PaginatedEmpresasSocios,
)
from .service import EmpresasSociosService

router = APIRouter(
    prefix="/appwrite/empresas-socios",
    tags=["Empresas Sócios"],
)


@router.get(
    "",
    summary="Listar sócios de empresas",
    description=(
        "Lista os sócios cadastrados na coleção 'empresas-socios' do Appwrite, "
        "com suporte a paginação, busca textual e filtro por empresa."
    ),
    response_model=PaginatedEmpresasSocios,
    response_model_exclude_none=True,
    response_model_by_alias=False,
)
async def list_empresas_socios(
    page: int = Query(1, ge=1, description="Página (>=1)"),
    limit: int | None = Query(None, ge=1, le=100, description="Tamanho da página (1-100)"),
    q: str | None = Query(None, description="Busca por nome, qualificação ou identificador"),
    sort: str | None = Query(
        None,
        pattern=r"^(nome|qualificacao|\$createdAt)$",
        description="Campo de ordenação",
    ),
    order: str | None = Query(
        None,
        pattern=r"^(asc|desc)$",
        description="Ordem da ordenação",
    ),
    empresas_dados_id: str | None = Query(
        None,
        description="Filtrar pelo ID do registro em 'empresas-dados'.",
    ),
    _: None = Depends(require_api_key),
    service: EmpresasSociosService = Depends(get_empresas_socios_service),
) -> PaginatedEmpresasSocios:
    return await service.list(
        page=page,
        limit=limit,
        q=q,
        sort=sort,
        order=order,
        empresas_dados_id=empresas_dados_id,
    )


@router.get(
    "/{socio_id}",
    summary="Obter sócio",
    description="Recupera um sócio específico pelo ID do documento.",
    response_model=EmpresasSociosOut,
    response_model_exclude_none=True,
    response_model_by_alias=False,
)
async def get_empresas_socio(
    socio_id: str,
    _: None = Depends(require_api_key),
    service: EmpresasSociosService = Depends(get_empresas_socios_service),
) -> EmpresasSociosOut:
    return await service.get(socio_id)


@router.post(
    "",
    summary="Criar sócio",
    description="Cria um novo registro de sócio vinculado a uma empresa no Appwrite.",
    response_model=EmpresasSociosOut,
    response_model_exclude_none=True,
    status_code=status.HTTP_201_CREATED,
    response_model_by_alias=False,
)
async def create_empresas_socio(
    payload: EmpresasSociosCreate,
    _: None = Depends(require_api_key),
    service: EmpresasSociosService = Depends(get_empresas_socios_service),
) -> EmpresasSociosOut:
    return await service.create(payload)


@router.patch(
    "/{socio_id}",
    summary="Atualizar sócio",
    description="Atualiza parcialmente os dados de um sócio cadastrado.",
    response_model=EmpresasSociosOut,
    response_model_exclude_none=True,
    response_model_by_alias=False,
)
async def update_empresas_socio(
    socio_id: str,
    payload: EmpresasSociosUpdate,
    _: None = Depends(require_api_key),
    service: EmpresasSociosService = Depends(get_empresas_socios_service),
) -> EmpresasSociosOut:
    return await service.update(socio_id, payload)


@router.delete(
    "/{socio_id}",
    summary="Remover sócio",
    description="Exclui um sócio da coleção no Appwrite.",
    status_code=status.HTTP_204_NO_CONTENT,
)
async def delete_empresas_socio(
    socio_id: str,
    _: None = Depends(require_api_key),
    service: EmpresasSociosService = Depends(get_empresas_socios_service),
) -> None:
    await service.delete(socio_id)
