# coding=utf-8

import json
from django.db import transaction
from rest_framework.views import APIView
from rest_framework.decorators import action

from utils.custom_modelviewset import CustomModelViewSet
from utils.permission import IsAdministratorUser
from utils import response_ok
from apps.log.models import BizLog
from apps.admin import admin_log

from .serializers import WechatAppletSerializer
from apps.WechatApplet.filters import WechatAppletFilter
from apps.WechatApplet.models import WechatApplet
from apps.WechatTp.models import WechatTp


class TemplateListViewSet(APIView):
    permission_classes = [IsAdministratorUser, ]

    def get(self, request):
        tp = WechatTp.getDefault()
        ret = tp.getTemplateList()
        return response_ok(ret)


class WechatAppletViewSet(CustomModelViewSet):
    # permission_classes = [IsAdministratorUser, ]
    queryset = WechatApplet.objects.filter()
    serializer_class = WechatAppletSerializer

    def filter_queryset(self, queryset):
        f = WechatAppletFilter(self.request.GET, queryset=queryset)
        return f.qs

    @action(methods=['post'], detail=True)
    def upload_code(self, request, pk):
        # 上传代码
        template_id = request.POST.get('template_id')
        user_version = request.POST.get('user_version')
        user_desc = request.POST.get('user_desc')
        app = WechatApplet.getById(pk)
        with transaction.atomic():
            app.uploadCode(template_id, user_version, user_desc)
            admin_log(request.user, BizLog.INSERT,u'小程序上传审核代码，id=%d' % app.id, request.POST.dict())
        return response_ok()

    @action(methods=['post'], detail=False)
    def batch_upload_code(self, request):
        # 批量上传代码
        template_id = request.POST.get('template_id')
        user_version = request.POST.get('user_version')
        user_desc = request.POST.get('user_desc')
        app_ids = json.loads(request.POST.get('ids'))

        apps = WechatApplet.objects.filter(id__in=app_ids)
        for app in apps:
            try:
                with transaction.atomic():
                    app.uploadCode(template_id, user_version, user_desc)
            except:
                pass
        admin_log(request.user, BizLog.INSERT, u'小程序批量上传审核代码', request.POST.dict())

        return response_ok()

    @action(methods=['post'], detail=False)
    def refresh_audit_status(self, request):
        # 查询最新一次提交代码的审核状态  多选更新 审核状态
        app_ids = json.loads(request.POST.get('ids'))
        for app_id in app_ids:
            app = WechatApplet.getById(app_id)
            app.refreshAuditStatus()
        return response_ok()

    @action(methods=['post'], detail=True)
    def set_secret(self, request, pk):
        secret = request.POST.get('secret')
        app = WechatApplet.getById(pk)
        with transaction.atomic():
            app.secret = secret
            app.save()
            admin_log(request.user, BizLog.INSERT, u'设置小程序秘钥, id=%d' % app.id, secret)
        return response_ok()

    @action(methods=['post'], detail=True)
    def set_merchant(self, request, pk):
        tenant_num = request.POST.get('tenant_num')
        tenant_key = request.POST.get('tenant_key')
        app = WechatApplet.getById(pk)
        with transaction.atomic():
            app.tenant_num = tenant_num
            app.tenant_key = tenant_key
            app.save()
            admin_log(request.user, BizLog.INSERT, u'设置小程序商户号和商户秘钥, id=%d' % app.id)
        return response_ok()

    @action(methods=['post'], detail=False)
    def add_plugin(self, request):
        app_ids = json.loads(request.POST.get('ids'))
        for app_id in app_ids:
            apps = WechatApplet.getById(app_id)
            apps.addPlugin()
        return response_ok()

    @action(methods=['post'], detail=False)
    def release(self, request):
        app_ids = json.loads(request.POST.get('ids'))
        for app_id in app_ids:
            app = WechatApplet.getById(app_id)
            app.releaseApplet()
        return response_ok()

    @action(methods=['post'], detail=True)
    def upload_cert(self, request, pk):
        file = request.FILES.get('file', None)
        app = WechatApplet.getById(pk)
        with transaction.atomic():
            app.upload_cert_file(file)
            admin_log(request.user, BizLog.INSERT, u'设置小程序企业支付api证书, id=%d' % app.id)
        return response_ok()



