from django.db import transaction

from rest_framework import viewsets
from rest_framework.decorators import detail_route
from rest_framework.response import Response

from misago.core.shortcuts import get_int_or_404, get_object_or_404
from misago.readtracker.categoriestracker import read_category
from misago.threads.threadtypes import trees_map

from .models import THREADS_ROOT_NAME, Category
from .permissions import allow_browse_category, allow_see_category
from .serializers import CategorySerializer
from .utils import get_categories_tree


class CategoryViewSet(viewsets.ViewSet):
    def list(self, request):
        categories_tree = get_categories_tree(request.user)
        return Response(CategorySerializer(categories_tree, many=True).data)

    @detail_route(methods=['post'])
    @transaction.atomic
    def read(self, request, pk):
        request.user.lock()

        category_id = get_int_or_404(pk)
        threads_tree_id = trees_map.get_tree_id_for_root(THREADS_ROOT_NAME)

        category = get_object_or_404(Category,
            id=category_id,
            tree_id=threads_tree_id,
        )

        if category.level:
            allow_see_category(request.user, category)
            allow_browse_category(request.user, category)

        read_category(request.user, category)

        return Response({'detail': 'ok'})