import _thread
import logging

import django.dispatch
from django.conf import settings
from django.contrib.admin.models import LogEntry
from django.contrib.auth.signals import user_logged_in, user_logged_out
from django.core.mail import EmailMultiAlternatives
from django.db.models.signals import post_save
from django.dispatch import receiver

from comments.models import Comment
from comments.utils import send_comment_email
from djangoblog.spider_notify import SpiderNotify
from djangoblog.utils import cache, expire_view_cache, delete_sidebar_cache, delete_view_cache
from djangoblog.utils import get_current_site
from oauth.models import OAuthUser

logger = logging.getLogger(__name__)

oauth_user_login_signal = django.dispatch.Signal(['id'])

send_email_signal = django.dispatch.Signal(
    ['emailto', 'title', 'content'])


@receiver(send_email_signal)
def send_email_signal_handler(sender, **kwargs):
    """
    sh:
    发送邮件信号的接收器：处理邮件发送逻辑并记录发送日志
    """
    """从信号参数中提取邮件信息"""
    emailto = kwargs['emailto']
    title = kwargs['title']
    content = kwargs['content']
    """创建HTML格式邮件"""
    msg = EmailMultiAlternatives(
        title,
        content,
        from_email=settings.DEFAULT_FROM_EMAIL,
        to=emailto)
    msg.content_subtype = "html"
    """初始化邮件发送日志记录"""
    from servermanager.models import EmailSendLog
    log = EmailSendLog()
    log.title = title
    log.content = content
    log.emailto = ','.join(emailto)

    try:
        result = msg.send()
        log.send_result = result > 0
    except Exception as e:
        logger.error(f"失败邮箱号: {emailto}, {e}")
        log.send_result = False
    log.save()


@receiver(oauth_user_login_signal)
def oauth_user_login_signal_handler(sender, **kwargs):
    oauth_user_id = kwargs['id']
    """
    OAuth用户登录信号的接收器：处理用户头像本地化存储
    """
    oauthuser = OAuthUser.objects.get(id=oauth_user_id)
    site = get_current_site().domain
    if oauthuser.picture and oauthuser.picture.find(site) == -1:
        from djangoblog.utils import save_user_avatar
        oauthuser.picture = save_user_avatar(oauthuser.picture)
        oauthuser.save()

    delete_sidebar_cache()


@receiver(post_save)
def _notify_baidu_spider(instance, is_update_views):
    if not settings.TESTING and not is_update_views:
        try:
            notify_url = instance.get_full_url()
            SpiderNotify.baidu_notify([notify_url])
        except Exception as ex:
            logger.error("notify spider: %s", ex)
    return not is_update_views


def _handle_comment_cache(instance):
    path = instance.article.get_absolute_url()
    site = get_current_site().domain
    if site.find(':') > 0:
        site = site[:site.find(':')]

    expire_view_cache(
        path,
        servername=site,
        serverport=80,
        key_prefix='blogdetail'
    )

    if cache.get('seo_processor'):
        cache.delete('seo_processor')

    comment_cache_key = 'article_comments_{id}'.format(id=instance.article.id)
    cache.delete(comment_cache_key)
    delete_sidebar_cache()
    delete_view_cache(prefix='article_comments', keys=[str(instance.article.pk)])

    _thread.start_new_thread(send_comment_email, args=(instance,))

def model_post_save_callback(
    instance,
    update_fields,
    **kwargs
):
    clearcache = False

    """跳过LogEntry类型的实例"""
    if isinstance(instance, LogEntry):
        return

    """处理百度蜘蛛通知逻辑"""
    if 'get_full_url' in dir(instance):
        is_update_views = update_fields == {'views'}
        clearcache = _notify_baidu_spider(instance, is_update_views) or clearcache

    """处理评论相关逻辑"""
    if isinstance(instance, Comment) and instance.is_enable:
        _handle_comment_cache(instance)
        clearcache = True

    """最终清理缓存"""
    if clearcache:
        cache.clear()


@receiver(user_logged_in)
@receiver(user_logged_out)
def user_auth_callback(sender, request, user, **kwargs):
    if user and user.username:
        logger.info(user)
        delete_sidebar_cache()
        # cache.clear()
