#!/usr/bin/env python
# -*- coding:utf-8 -*-
# project: 3月 
# author: liuyu
# date: 2020/3/8
import uuid
import string
import random
import time
from django.core.cache import cache
from fir_ser.settings import CACHE_KEY_TEMPLATE
import logging

logger = logging.getLogger(__file__)


class DownloadToken(object):

    def make_token(self, release_id, time_limit=60, key='', force_new=False):
        token_key = "_".join([key.lower(), CACHE_KEY_TEMPLATE.get("make_token_key"), release_id])
        token = cache.get(token_key)
        if token and not force_new:
            logger.debug("make_token  cache exists get token:%s  release_id:%s force_new:%s token_key:%s" % (
                token, release_id, force_new, token_key))
            return token
        else:
            random_str = uuid.uuid1().__str__().split("-")[0:-1]
            user_ran_str = uuid.uuid5(uuid.NAMESPACE_DNS, release_id).__str__().split("-")
            user_ran_str.extend(random_str)
            token = "".join(user_ran_str)
            cache.set(token, {
                "atime": time.time() + time_limit,
                "data": release_id
            }, time_limit)
            cache.set(token_key, token, time_limit - 1)
            logger.debug(
                "make_token  cache not exists get token:%s  release_id:%s force_new:%s token_key:%s" % (
                    token, release_id, force_new, token_key))
            return token

    def verify_token(self, token, release_id):
        try:
            values = cache.get(token)
            if values and release_id == values.get("data", None):
                logger.debug("verify_token token:%s  release_id:%s success" % (token, release_id))
                return True
        except Exception as e:
            logger.error("verify_token token:%s  release_id:%s failed Exception:%s" % (token, release_id, e))
            return False
        logger.error("verify_token token:%s  release_id:%s failed" % (token, release_id))
        return False


def generateTokenForMedium(medium):
    if medium == 'email':
        return generateAlphanumericTokenOfLength(32)
    elif medium == 'wechat':
        return 'WeChat'
    else:
        return generateNumericTokenOfLength(6)


def generateNumericTokenOfLength(length, random_str=''):
    return "".join([random.choice(string.digits + random_str) for _ in range(length)])


def generateAlphanumericTokenOfLength(length):
    return "".join(
        [random.choice(string.digits + string.ascii_lowercase + string.ascii_uppercase) for _ in range(length)])
