# coding: utf-8
"""
Created by Jeeyshe 2020/4/4 下午5:16, contact with jeeyshe@gmail.com or website https://www.lujianxin.com
---------------------------------------------------------------------------------------------------------
>>> 项目中的一些定时任务
"""
import logging
import datetime
import time

from django.core.mail import send_mail
from django.core.cache import caches
from django.contrib.auth import get_user_model
from django.template import loader

from tasks import app
from blog.models import Expand, Blog, Link
from tasks.mail import add_prefix, supervisor_receivers, webmaster_receivers
from ishare.settings import SERVER_EMAIL, SITE

logger = logging.getLogger(__name__)
UserAccount = get_user_model()


@app.task(name='cron.update_visit_count')
def update_visit_count(*args, **kwargs):
    """
    每小时从redis更新网站总浏览量到mysql
    """
    logger.info("Start update visit count")
    cache = caches['four']
    obj, is_created = Expand.objects.get_or_create(key='VISIT_CNT', defaults={'key': 'VISIT_CNT', 'value': '1'})
    if not is_created:
        real = cache.get('total', 0)
        obj.value = str(int(obj.value) + real)
        obj.save(update_fields=('value',))
        cache.set('total', 0, 60 * 60 + 60)
    logger.info("更新网站浏览量完成")


@app.task(name='cron.notify_new_link')
def notify_new_link(*args, **kwargs):
    """
    每天定时提醒今日新增友链
    """
    logger.info("Start notify new link today")
    now = datetime.datetime.now()
    start = now - datetime.timedelta(days=1, minutes=3)
    links = Link.objects.filter(is_active=False, add__gte=start, add__lt=now)
    total = links.count()
    logger.info("Find %s new links" % total)
    if total > 0:
        html_email = loader.render_to_string(
            'mail/new_link_today.html',
            context={
                'title': 'New Link Today',
                'total': total,
                'public': links.filter(cat=0),
                'personal': links.filter(cat=1),
                'business': links.filter(cat=2),
                'SITE': SITE,
            }
        )
        send_mail(
            subject=add_prefix("新增友链通知"),
            message='',
            from_email=SERVER_EMAIL,
            recipient_list=supervisor_receivers(),
            html_message=html_email,
        )
    logger.info("今日新增的待通过友链")


@app.task(name='cron.notify_new_article')
def notify_new_article(*args, **kwargs):
    """
    每天定时提醒今日新增待审核文章
    """
    logger.info("Start notify new article today")
    now = datetime.datetime.now()
    start = now - datetime.timedelta(days=1, minutes=3)
    blogs = Blog.objects.filter(is_active=False, add__lt=now, add__gte=start)
    total = blogs.count()
    logger.info("Find %s new blog" % total)
    if total > 0:
        html_email = loader.render_to_string(
            'mail/new_blog_today.html',
            context={
                'title': 'New Blog Today',
                'total': total,
                'blogs': blogs,
                'SITE': SITE,
            }
        )
        send_mail(
            subject=add_prefix("新增文章通知"),
            message="",
            from_email=SERVER_EMAIL,
            recipient_list=supervisor_receivers(),
            html_message=html_email,
        )
    print("今日新增待审核文章")


@app.task(name='cron.recommend_month')
def recommend_month(*args, **kwargs):
    """
    每月向友链发送阅读推荐
    """
    logger.info("Start recommend to friend-links")
    now = datetime.datetime.now()
    start = now - datetime.timedelta(days=30, hours=1)
    blogs = Blog.objects.filter(is_active=True, add__lt=now, add__gte=start)
    total = blogs.count()
    logger.info("Find %s new blog" % total)
    links = Link.objects.filter(is_active=True, cat__gt=0, email__isnull=False)
    if total > 0:
        for link in links:
            html_email = loader.render_to_string(
                'mail/new_blog_this_month.html',
                context={
                    'title': 'New Blog This Month',
                    'total': total,
                    'link': link,
                    'blogs': blogs,
                    'days': (now - link.add).days,
                    'SITE': SITE,
                }
            )
            try:
                send_mail(
                    subject=add_prefix("友链推荐阅读通知"),
                    message="",
                    from_email=SERVER_EMAIL,
                    recipient_list=[link.email],
                    html_message=html_email,
                )
            except Exception as e:
                logger.error("通知[{}]站长失败: {}".format(link.link_name, e))
            else:
                logger.info("通知[{}]站长成功!".format(link.link_name))
            time.sleep(5)
    print("每月总结完毕")