from django.urls import reverse
from typing import Any
from unittest import mock


def disable_gestionnaire_permission(type):
    """
    Utilise "mock" pour ignorer le gestionnaire de permissions dans la vue.
    TODO trouver un mécanisme de mock plus précis

    :param type: le type de la vue
    :type type: class:`ModelViewSet` par exemple

    :return: résultat du mock
    :rtype: voir mock
    """
    return mock.patch.object(type, 'permission_classes', [p for p in type.permission_classes if p.__name__ != 'GestionnairePermission'])


def api_url(basename: str, pk: Any = None) -> str:
    """
    renvoie l'URL selon qu'on a besoin d'un ID ou non
    nécessite l'utilisation de SimpleRouter ou DefaultRouter (voir urls.py)

    :param basename: valeur de "basename"
    :type basename: str

    :param pk: valeur qui permet de savoir s'il s'agit d'une URL "list" ou "detail" (voir https://www.django-rest-framework.org/api-guide/routers/#simplerouter)
    :type pk: Any

    :return: URL
    :rtype: str
    """
    return reverse(f'{basename}-list') if pk is None else reverse(f'{basename}-detail', args=[pk])


class TestUtilsMixin:
    """
    mixin à ajouter pour les tests
    """

    def _api_url(self, pk: Any = None) -> str:
        """ voir fonction "api_url", nécessite un champ "basename" pour remplir le paramètre """
        return api_url(self.basename, pk)
