from rest_framework import routers, viewsets
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated, IsAdminUser

from authentication.signature_auth import SignatureAuthenticationLocal
from hostadmin.models import Domain
from hostadmin.serializers import DomainSerializer, CategorySerializer, PropertySerializer, TagSerializer
from toolshed.models import Category, Property, Tag

router = routers.SimpleRouter()


class DomainViewSet(viewsets.ModelViewSet):
    queryset = Domain.objects.all()
    serializer_class = DomainSerializer
    authentication_classes = [TokenAuthentication, SignatureAuthenticationLocal]
    permission_classes = [IsAuthenticated, IsAdminUser]

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)


class CategoryViewSet(viewsets.ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    authentication_classes = [TokenAuthentication, SignatureAuthenticationLocal]
    permission_classes = [IsAuthenticated, IsAdminUser]

    def perform_create(self, serializer):
        serializer.save(origin='api')


class PropertyViewSet(viewsets.ModelViewSet):
    queryset = Property.objects.all()
    serializer_class = PropertySerializer
    authentication_classes = [TokenAuthentication, SignatureAuthenticationLocal]
    permission_classes = [IsAuthenticated, IsAdminUser]

    def perform_create(self, serializer):
        serializer.save(origin='api')


class TagViewSet(viewsets.ModelViewSet):
    queryset = Tag.objects.all()
    serializer_class = TagSerializer
    authentication_classes = [TokenAuthentication, SignatureAuthenticationLocal]
    permission_classes = [IsAuthenticated, IsAdminUser]

    def perform_create(self, serializer):
        serializer.save(origin='api')


router.register(r'domains', DomainViewSet, basename='domains')
router.register(r'categories', CategoryViewSet, basename='categories')
router.register(r'properties', PropertyViewSet, basename='properties')
router.register(r'tags', TagViewSet, basename='tags')

urlpatterns = [
    *router.urls,
]