from django.http import JsonResponse
from django.shortcuts import render
from .utils import *
import logging
from django.conf import settings
import json
from pyecharts import options
from pyecharts.charts import Line, Page, Pie

logger = logging.getLogger(__name__)


def get_xaxis_days(days=60):
    """
    获取 X 坐标,按天。取两个月数据
    """
    xaxis_days = []
    for i in range(0, days):
        xaxis_days.append(time.strftime("%Y%m%d", time.localtime(time.time() - i * 86400)))
    xaxis_days.sort()
    return xaxis_days


def api_profile_line_chart() -> Line:
    """
    接口平均耗时
    :return:
    """
    xaxis = get_xaxis_days(days=10)

    apis = list(filter(lambda x: x, R.smembers(settings.REDIS_API_KEY)))

    line = (
        Line()
        .add_xaxis(xaxis)
        .set_global_opts(title_opts=options.TitleOpts(title="API 耗时走势"),
                         yaxis_opts=options.AxisOpts(
                             is_scale=True,
                             splitline_opts=options.SplitLineOpts(is_show=True)
                         ),
                         tooltip_opts=options.TooltipOpts(trigger='axis'),
                         )
    )
    for api in apis:
        if api in get_profile_apis():
            api_redis_keys = [settings.REDIS_API_AVG_KEY % (api, day) for day in xaxis]
            api_profile = R.mget(*api_redis_keys)
            line.add_yaxis(api, api_profile, is_connect_nones=True, is_smooth=True,
                           label_opts=options.LabelOpts(is_show=False))

    return line.dump_options()


def uv_line_chart() -> Line:
    """
    UV折线图,包括总 UV、新用户 UV、注册 UV
    """
    xaxis = get_xaxis_days()

    uv_all_redis_keys = [settings.REDIS_UV_ALL_KEY % day for day in xaxis]
    uv_new_redis_keys = [settings.REDIS_UV_NEW_KEY % day for day in xaxis]
    uv_reg_redis_keys = [settings.REDIS_REG_KEY % day for day in xaxis]

    uv_all = R.mget(*uv_all_redis_keys)
    uv_new = R.mget(*uv_new_redis_keys)
    uv_reg = R.mget(*uv_reg_redis_keys)

    line = (
        Line()
        .add_xaxis(xaxis)
        .add_yaxis("总用户数(访问设备)", uv_all, is_connect_nones=True, is_smooth=True)
        .add_yaxis("新用户数(一周未访问)", uv_new, is_connect_nones=True, is_smooth=True)
        .add_yaxis("注册用户数", uv_reg, is_connect_nones=True, is_smooth=True)
        .set_global_opts(title_opts=options.TitleOpts(title="用户数走势"),
                         yaxis_opts=options.AxisOpts(
                             is_scale=True,
                             splitline_opts=options.SplitLineOpts(is_show=True)
                         ),
                         tooltip_opts=options.TooltipOpts(trigger='axis'),
                         )
        .dump_options()
    )
    return line


def refer_pv_line_chart() -> Line:
    """
    UV折线图,外域的每天流量趋势
    """
    xaxis = get_xaxis_days()

    uv_zhihu_redis_keys = [settings.REDIS_REFER_PV_DAY_KEY % ('link.zhihu.com', day) for day in xaxis]
    uv_ryf_redis_keys = [settings.REDIS_REFER_PV_DAY_KEY % ('www.ruanyifeng.com', day) for day in xaxis]
    uv_github_redis_keys = [settings.REDIS_REFER_PV_DAY_KEY % ('github.com', day) for day in xaxis]
    uv_baidu_redis_keys = [settings.REDIS_REFER_PV_DAY_KEY % ('www.baidu.com', day) for day in xaxis]
    uv_google_redis_keys = [settings.REDIS_REFER_PV_DAY_KEY % ('www.google.com', day) for day in xaxis]
    uv_wanqu_redis_keys = [settings.REDIS_REFER_PV_DAY_KEY % ('wanqu.co', day) for day in xaxis]

    uv_zhihu = R.mget(*uv_zhihu_redis_keys)
    uv_ryf = R.mget(*uv_ryf_redis_keys)
    uv_github = R.mget(*uv_github_redis_keys)
    uv_baidu = R.mget(*uv_baidu_redis_keys)
    uv_google = R.mget(*uv_google_redis_keys)
    uv_wanqu = R.mget(*uv_wanqu_redis_keys)

    line = (
        Line()
        .add_xaxis(xaxis)
        .add_yaxis("zhihu", uv_zhihu, is_connect_nones=True, is_smooth=True)
        .add_yaxis("ruanyifeng", uv_ryf, is_connect_nones=True, is_smooth=True)
        .add_yaxis("github", uv_github, is_connect_nones=True, is_smooth=True)
        .add_yaxis("baidu", uv_baidu, is_connect_nones=True, is_smooth=True)
        .add_yaxis("google", uv_google, is_connect_nones=True, is_smooth=True)
        .add_yaxis("wanqu", uv_wanqu, is_connect_nones=True, is_smooth=True)
        .set_global_opts(title_opts=options.TitleOpts(title="Referer各域名PV走势"),
                         yaxis_opts=options.AxisOpts(
                             is_scale=True,
                             splitline_opts=options.SplitLineOpts(is_show=True)
                         ),
                         tooltip_opts=options.TooltipOpts(trigger='axis'),
                         )
        .dump_options()
    )
    return line


def refer_pie_chart() -> Pie:
    refer_hosts = list(filter(lambda x: x, R.smembers(settings.REDIS_REFER_ALL_KEY)))
    refer_host_pv_keys = [settings.REDIS_REFER_PV_KEY % host for host in refer_hosts]

    c = (
        Pie()
        .add(
            "",
            [list(z) for z in zip(refer_hosts, R.mget(*refer_host_pv_keys)) if int(z[1]) > 100],
            # radius=["30%", "75%"],
            # rosetype="radius",
        )
        .set_global_opts(
            title_opts=options.TitleOpts(title="Referer来源占比"),
            legend_opts=options.LegendOpts(
                type_="scroll", pos_left="80%", orient="vertical"
            ),
        )
        .set_series_opts(label_opts=options.LabelOpts(formatter="{b}: {c}"))
        .dump_options()
    )
    return c


def get_uv_chart_data(request):
    return JsonResponse(json.loads(uv_line_chart()))


def get_refer_pie_data(request):
    return JsonResponse(json.loads(refer_pie_chart()))


def get_refer_pv_chart_data(request):
    return JsonResponse(json.loads(refer_pv_line_chart()))


def get_api_profile_chart_data(request):
    return JsonResponse(json.loads(api_profile_line_chart()))


def dashboard(request):
    return render(request, 'dashboard/index.html')


def get_warn_log(request):
    warn_log_file = settings.LOGGING['handlers']['my_warn']['filename']
    logs = list(reversed(open(warn_log_file).read().split('\n')))[:500]

    logs = [l for l in logs if l]

    context = dict()
    context['logs'] = logs

    return render(request, 'dashboard/logs.html', context=context)