# coding=utf-8

import time
from django.db import models
from django.utils import timezone

from utils.exceptions import CustomError

from utils.wx.wechat import WeChat


class WechatTp(models.Model):
    component_appid = models.CharField(max_length=512, verbose_name=u'第三方平台appid')
    component_appsecret = models.CharField(max_length=512, verbose_name=u'第三方平台appsecret')
    m_encode_key = models.CharField(max_length=512, verbose_name=u'消息加密key')
    m_token = models.CharField(max_length=512, verbose_name=u'消息校验token')

    component_verify_ticket = models.CharField(max_length=512, verbose_name=u'验证票据', null=True)
    component_access_token = models.CharField(max_length=512, verbose_name=u'令牌', null=True)
    access_token_gtime = models.DateTimeField(verbose_name=u"获取令牌时间", null=True)
    expires_in = models.IntegerField(verbose_name=u'令牌有效期', null=True)

    class Meta:
        db_table = "wechat_tp"
        ordering = ['-id']
        index_together = ()
        verbose_name = u"第三方平台"
        default_permissions = ()

    @staticmethod
    def getDefault():
        tp = WechatTp.objects.filter().first()
        if not tp:
            raise CustomError(u'未找到微信第三方平台！')
        return tp

    @staticmethod
    def getByAppid(appid):
        component = WechatTp.objects.filter(component_appid=appid).first()
        if not component:
            raise CustomError(u'未找到相应的第三方平台！')
        return component

    def getAppid(self):
        return self.component_appid

    def getToken(self):
        return self.m_token

    def getEncodeKey(self):
        return self.m_encode_key

    def getAccessToken(self):
        if self.component_access_token:
            last_time = time.mktime(self.access_token_gtime.timetuple()) + self.expires_in
            now = time.mktime(timezone.now().timetuple())
            if last_time > now:
                return self.component_access_token
        res = WeChat.getComponentAccessToken(self.component_appid, self.component_appsecret, self.component_verify_ticket)
        self.refreshAccessToken(timezone.now(), res['component_access_token'], res['expires_in'])
        return self.component_access_token

    def getPreAuthCode(self):
        res = WeChat.getPreAuthCode(self.component_appid, self.getAccessToken())
        return res['pre_auth_code']

    def refreshVerifyTicket(self, component_verify_ticket):
        self.component_verify_ticket = component_verify_ticket
        self.save()

    def refreshAccessToken(self, gtime, component_access_token, expires_in):
        self.access_token_gtime = gtime
        self.component_access_token = component_access_token
        self.expires_in = expires_in
        self.save()

    def getAuthUrl(self, tenant_id):
        url = 'https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=' + self.getAppid() + '&pre_auth_code=' + self.getPreAuthCode()
        url += '&redirect_uri=https://baoxiu360.top/api/redirect_authorize/' + tenant_id + '/&auth_type=2'
        return url

    def getTemplateList(self):
        template_list = WeChat.getCodeTemplateList(self.getAccessToken())
        return template_list
