# -*- coding:utf-8 -*-
# !/usr/bin/env python
# Time 17-10-25
# Author Yo
# Email YoLoveLife@outlook.com

from __future__ import absolute_import, unicode_literals
from celery import Task,task
from dns import resolver
import time
from django.conf import settings
from yocdn.models import CDN
from deveops.tools.aliyun_v2.request.cdn import AliyunCDNTool
from deveops.tools.qiniu.cdn import QiNiuCDNTool

class CDNTask(Task):
    def on_failure(self, exc, task_id, args, kwargs, einfo):
        print('{0!r} failed: {1!r}'.format(task_id, exc))


def reflush(url, nameserver):
    r = resolver.Resolver()
    r.nameservers = [nameserver]
    try:
        answers = r.query(url, 'CNAME')
        for rdata in answers:
            return rdata.to_text()[:-1]
    except resolver.NoAnswer as e:
        return ''
    except resolver.NXDOMAIN as e:
        return ''
    return ''


def pick_domain(url):
    if 'http' in url: # 如果是HTTP 或者HTTPS的话
        index = url.find('//')
        header = url.find('/', index+2)
        return url[index+2:header]
    else:
        header = url.find('/')
        return url[:header]


def choose_type(domain):
    CNAME = reflush(domain, settings.OUTER_DNS)
    if 'alikunlun' in CNAME:
        return settings.TYPE_CDN_ALIYUN
    elif 'qiniu' in CNAME:
        return settings.TYPE_CDN_QN
    elif 'wangs' in CNAME:
        return settings.TYPE_CDN_WS


def process(API, obj):
    task_id = API.tool_flush_cdn(obj.url)['RefreshTaskId']
    while True:
        dict_models = API.tool_get_task(task_id).__next__()
        CDN.objects.filter(
            uuid=obj.uuid, id=obj.id
        ).update(
            process=dict_models['process'],
            status=dict_models['status'],
        )
        if dict_models['status'] == settings.STATUS_CDN_DONE or dict_models['status'] == settings.STATUS_CDN_ERROR:
            return
        time.sleep(1)


@task(base=CDNTask)
def refresh_cdn(obj):
    type = choose_type(pick_domain(obj.url))
    CDN.objects.filter(
        uuid=obj.uuid,
        id=obj.id,
    ).update(type=type)

    if obj.type == settings.TYPE_CDN_ALIYUN:
        API = AliyunCDNTool()
        process(API, obj)
    elif obj.type == settings.TYPE_CDN_QN:
        API = QiNiuCDNTool()
        process(API, obj)