import json

from django.contrib.auth.decorators import login_required
from django.core import serializers
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.http import JsonResponse, HttpResponseRedirect
from django.shortcuts import render

from blog.views import get_record_and_tags
from system.error.ServerException import ServerException
from blog import models
from blog.controller import article


@login_required(login_url='/')
def tags_page(request):
    # page: int = -1, is_paginator: bool = False, search_name: str = None
    if request.method == 'GET':
        page = request.GET.get('page')
        if page is None:
            page = 1
        else:
            page = int(page)
        search_name = request.GET.get('search_name')
        if search_name is None:
            tags = models.Tags.objects.all().values('id','name')
        else:
            tags = models.Tags.objects.filter(name__contains=search_name).values('id','name')
        if page <= 0:
            page = 1
        paginator = Paginator(tags, 15)
        try:
            tags = paginator.page(page)
        except PageNotAnInteger:
            tags = paginator.page(1)
        except EmptyPage:
            tags = paginator.page(paginator.num_pages)
        return render(request, 'management/tags/tags.html', context={'tags': tags})


def current_tag(request, name):
    tag_obj = models.Tags.objects.get(name=name)
    page = request.GET.get('page')
    if page is None:
        page = 0
    result = get_record_and_tags()

    context = {'current_category': tag_obj.name,
               'articles': article.get_article(is_paginator=True, page=int(page), tag=tag_obj),
               'records': result['records'],
               'tags': result['tags']
               }

    return render(request, 'category.html', context=context)


@login_required(login_url='/')
def get_all_tag(request):
    tags = serializers.serialize("json", models.Tags.objects.all())

    return JsonResponse(json.loads(tags), safe=False)


@login_required(login_url='/')
def search(request):
    term = request.GET.get("term")
    if term is not None and term != '':
        arr = []
        tags = models.Tags.objects.filter(name__contains=term)
        for item in tags:
            arr.append(item.name)
        return JsonResponse(arr, safe=False)
    else:
        arr = []
        tags = models.Tags.objects.all()
        for item in tags:
            arr.append(item.name)
        return JsonResponse(arr, safe=False)


@login_required(login_url='/')
def add_tag(request):
    if request.method == 'POST':
        tag_name = request.POST.get("tag_name")
        if tag_name == '':
            return JsonResponse({'success': False}, safe=False)
        else:
            obj = models.Tags(name=tag_name)
            obj.save()
            return JsonResponse({'success': True}, safe=False)
    else:
        raise ServerException("错误的请求")


@login_required(login_url='/')
def delete_tags(request):
    if request.method == 'GET':
        ids_str = request.GET.get("id")
        # models.Tags.objects.raw('DELETE FROM blog_tags WHERE id IN (%s)', ids_str)
        models.Tags.objects.get(id=int(ids_str)).delete()
        return HttpResponseRedirect('/management/tags')  # 跳转到主界面
    else:
        raise ServerException("错误的请求")