from typing import Callable

from django.conf import settings
from django.shortcuts import get_object_or_404
from rest_framework.request import Request

from common.api import JMSModelViewSet
from common.permissions import IsServiceAccount
from common.utils import is_uuid
from rbac.permissions import RBACPermission
from terminal.models import AppProvider
from terminal.serializers import (
    VirtualAppPublicationSerializer
)


class ProviderMixin:
    request: Request
    permission_denied: Callable
    kwargs: dict
    rbac_perms = (
        ('list', 'terminal.view_appprovider'),
        ('retrieve', 'terminal.view_appprovider'),
    )

    def get_permissions(self):
        if self.kwargs.get('host') and settings.DEBUG:
            return [RBACPermission()]
        else:
            return [IsServiceAccount()]

    def self_provider(self):
        try:
            return self.request.user.terminal.app_provider
        except AttributeError:
            raise self.permission_denied(self.request, 'User has no app provider')

    def pk_provider(self):
        return get_object_or_404(AppProvider, id=self.kwargs.get('provider'))

    @property
    def provider(self):
        if self.kwargs.get('provider'):
            host = self.pk_provider()
        else:
            host = self.self_provider()
        return host


class AppProviderAppViewSet(ProviderMixin, JMSModelViewSet):
    provider: AppProvider
    serializer_class = VirtualAppPublicationSerializer
    filterset_fields = ['provider__name', 'app__name', 'status']

    def get_object(self):
        pk = self.kwargs.get('pk')
        if not is_uuid(pk):
            return self.provider.publications.get(app__name=pk)
        else:
            return self.provider.publications.get(id=pk)

    def get_queryset(self):
        queryset = self.provider.publications.all()
        return queryset