from django.shortcuts import render, redirect, reverse
from django.http.response import JsonResponse
from django.views.generic.base import View
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page

from apps.goods.models import *
from apps.goods.forms import *


@method_decorator(cache_page(60 * 1), name='get')  # 通过对类的装饰,实现指定方法的缓存
# Create your views here.
class GoodCateView(View):

    @method_decorator(cache_page(60*1))  # 直接缓存指定方法
    def get(self, request):
        cates = GoodsCategory.objects.all()
        print(cates)
        return render(request, 'goods/cate_index.html', {'cates': cates})

    def post(self, request):
        pass


class GoodCateAddView(View):
    def __init__(self):
        self.alist = []

    def bind_data(self, data, _id, n):
        if id == 0:
            data = data.filter(parent__isnull=True)
        else:
            data = data.filter(parent=_id)
        for d in data:
            print(d)
            self.alist[d.id] = self.space_length(n) + d.name
            self.bind_data(d, d.id, n + 2)
        return self.alist

    def space_length(self, i):
        space = ''
        for j in range(1, i):
            space += "  "
        return space + "|--"

    def get(self, request):
        form_obj = GoodsCateForm()
        return render(request, 'goods/cate_add.html', {'form_obj': form_obj})

    def post(self, request):
        form_obj = GoodsCateForm(request.POST, request.FILES)
        if form_obj.is_valid():
            name = request.POST.get('name', '')
            cates = GoodsCategory.objects.filter(name=name)
            if cates:
                info = '分类已经存在'
            else:
                cate = GoodsCategory.objects.create(**form_obj.cleaned_data)
                return redirect('cate_index')
            return render(request, 'goods/cate_add.html', {'form_obj': form_obj, 'info': info})
        else:
            errors = form_obj.errors
            print(errors)
            return render(request, 'goods/cate_add.html', {'form_obj': form_obj, 'info': errors})


class GoodView(View):
    def __init__(self):
        self.alist = {}

    def binddata(self, datas, id, n):
        if id == 0:
            datas = GoodsCategory.objects.filter(parent__isnull=True)
        else:
            datas = GoodsCategory.objects.filter(parent_id=id)
        for data in datas:
            self.alist[data.id] = self.spacelength(n) + data.name
            self.binddata(datas, data.id, n + 2)
        return self.alist

    def spacelength(self, i):
        space = ''
        for j in range(1, i):
            space += "  "
        return space + "|--"

    def get(self, request):
        cates_all = GoodsCategory.objects.all()
        cates = self.binddata(cates_all, 0, 1)
        print(cates)
        return render(request, 'goods/goods_index.html', {'cates': cates})

    def post(self, request):
        pass


class GoodsAddView(View):
    def __init__(self):
        self.alist = {}

    def binddata(self, datas, id, n):
        if id == 0:
            datas = GoodsCategory.objects.filter(parent__isnull=True)
        else:
            datas = GoodsCategory.objects.filter(parent_id=id)
        for data in datas:
            self.alist[data.id] = self.spacelength(n) + data.name
            self.binddata(datas, data.id, n + 2)
        return self.alist

    def spacelength(self, i):
        space = ''
        for j in range(1, i):
            space += "  "
        return space + "|--"

    def get(self, request):
        cates_all = GoodsCategory.objects.all()
        cates = self.binddata(cates_all, 0, 1)
        return render(request, 'goods/goods_add.html', {'cates': cates})

    def post(self, request):
        good_dict = dict()
        good_dict['name'] = request.POST.get('name', '')
        cate_id = request.POST.get('parent_id', '')
        if cate_id:
            good_dict['category'] = GoodsCategory.objects.filter(id=cate_id)
        good_dict['market_price'] = request.POST.get('market_price', '0')
        good_dict['price'] = request.POST.get('price', '0')
        good_dict['goods_desc'] = request.POST.get('goods_desc', '')
        good_dict['main_img'] = request.POST.get('main_img', '')
        message = '字段需要填写'
        if not good_dict['name']:
            message = '请输入姓名'
        r = Goods.objects.create(**good_dict)
        print(r)
        return redirect(reverse('good_index'))


def ajax_goods(request):
    cate_id = request.POST.get('cate_id', '')
    goodname = request.POST.get('goodname', '')
    status = request.POST.get('status')
    search_dict = dict()
    if cate_id:
        search_dict['category'] = cate_id
    if goodname:
        search_dict['name__contains'] = goodname
    if status:
        search_dict['status'] = status
    page_size = 2
    page = int(request.GET['page'])
    total = Goods.objects.filter(**search_dict).count()
    goods = Goods.objects.filter(**search_dict).order_by('-id')[(page - 1) * page_size: page * page_size]
    rows = []
    datas = {'total': total, 'row': rows}
    for good in goods:
        print(good.category.name)
        rows.append({
            'id': good.id,
            'name': good.name,
            'market_price': good.market_price,
            'price': good.price,
            'category_id': good.category.name,
            'click_num': good.click_num,
            'amount': good.amount,
        })
    return JsonResponse(datas, safe=False, json_dumps_params={'ensure_ascii': False, 'indent': 4})