import json
import random
import warnings
from calendar import timegm
from datetime import datetime

import requests
from django.db.models import Q
from django_filters.rest_framework import DjangoFilterBackend
from openpyxl import Workbook, load_workbook
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.filters import OrderingFilter, SearchFilter
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework_jwt.serializers import (jwt_encode_handler,
                                            jwt_payload_handler)
from rest_framework_jwt.settings import api_settings
# Create your views here.

from .models import Article, Material
from .serializers import ArticelSerializer, ArticelListSerializer, MaterialSerializer
from utils.custom import CommonPagination
class ArticleViewSet(ModelViewSet):
    """
    文章：增删改查
    """
    perms_map = [
        {'get': '*'}, {'post': 'article_create'},
        {'put': 'article_update'}, {'delete': 'article_delete'}]
    queryset = Article.objects.filter(is_delete=0).all()
    serializer_class = ArticelSerializer
    pagination_class = CommonPagination
    filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter]
    search_fields = ['title','content']
    ordering_fields = ['title','update_time']
    ordering = ['-is_top', '-update_time']

    def get_serializer_class(self):
        if self.action=='list':
            return ArticelListSerializer
        else:
            return ArticelSerializer
    
    @action(methods=['put'], detail=True, url_name='top_article', perms_map=[{'*':'top_article'}])
    def top(self, request, *args, **kwargs):
        '''
        置顶文章
        '''
        instance = self.get_object()
        instance.is_top = False if instance.is_top else True
        instance.save()
        return Response(status=status.HTTP_200_OK)

class MaterialViewSet(ModelViewSet):
    """
    资料：增删改查
    """
    perms_map = [
        {'get': '*'}, {'post': 'material_create'},
        {'put': 'material_update'}, {'delete': 'material_delete'}]
    queryset = Material.objects.filter(is_delete=0)
    serializer_class = MaterialSerializer
    pagination_class = CommonPagination
    filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter]
    search_fields = ['name','description']
    ordering_fields = ['update_time', 'down_count']
    ordering = ['sort', '-down_count']
    filterset_fields = ['type', 'name']

    @action(methods=['get'], detail=True, url_name='down_material', perms_map=[{'*':'down_material'}])
    def down(self, request, *args, **kwargs):
        '''
        下载资料
        '''
        instance = self.get_object()
        instance.down_count = instance.down_count + 1
        instance.save()
        return Response({'path':instance.path, 'down_count':instance.down_count})