#lsx 评论视图模块

from django.shortcuts import render, get_object_or_404, redirect
from django.views import View
from django.http import JsonResponse
from django.contrib.auth.mixins import LoginRequiredMixin
from django.utils.translation import gettext_lazy as _
from django.utils import timezone

from blog.models import Article
from comments.models import Comment
from djangoblog.utils import get_blog_setting, cache

#lsx 评论列表视图
class CommentListView(View):
    #lsx 获取文章评论列表
    def get(self, request, article_id):
        #lsx 获取文章对象
        article = get_object_or_404(Article, id=article_id)
        #lsx 获取评论列表
        comments = Comment.objects.filter(
            article=article, is_enable=True, parent_comment=None).order_by('-create_time')
        #lsx 构建上下文
        context = {
            'article': article,
            'comments': comments
        }
        #lsx 渲染页面
        return render(request, 'comments/comment_list.html', context)

#lsx 发表评论视图
class CommentCreateView(View):
    #lsx 发表评论
    def post(self, request):
        #lsx 获取文章ID
        article_id = request.POST.get('article_id')
        #lsx 获取博客设置
        settings = get_blog_setting()
        #lsx 获取文章对象
        article = get_object_or_404(Article, id=article_id)
        #lsx 检查评论是否启用
        if not settings.comment_system_on:
            return JsonResponse({'status': 'fail', 'msg': _('评论已关闭')})
        #lsx 获取表单数据
        nickname = request.POST.get('nickname')
        email = request.POST.get('email')
        content = request.POST.get('content')
        website = request.POST.get('website', '')
        parent_comment_id = request.POST.get('parent_comment_id', '')
        #lsx 验证数据
        if not (nickname and email and content):
            return JsonResponse({'status': 'fail', 'msg': _('请填写必要信息')})
        #lsx 创建评论对象
        comment = Comment()
        comment.article = article  #lsx 设置评论所属文章
        comment.nickname = nickname
        comment.email = email
        comment.content = content
        comment.website = website
        #lsx 设置评论作者
        if request.user.is_authenticated:
            comment.author = request.user
        #lsx 设置评论是否需要审核
        comment.is_enable = not settings.comment_need_review
        #lsx 如果有父评论ID
        if parent_comment_id:
            try:
                #lsx 获取父评论
                parent_comment = Comment.objects.get(id=parent_comment_id)
                #lsx 设置父评论
                comment.parent_comment = parent_comment
            except Comment.DoesNotExist:
                parent_comment_id = None
        #lsx 保存评论到数据库
        comment.save(True)
        #lsx 清除缓存
        cache.clear()
        #lsx 返回成功响应
        return JsonResponse({'status': 'success', 'msg': _('评论发表成功')})

#lsx 删除评论视图（需要登录）
class CommentDeleteView(LoginRequiredMixin, View):
    #lsx 删除评论
    def post(self, request, comment_id):
        #lsx 获取评论对象
        comment = get_object_or_404(Comment, id=comment_id)
        #lsx 检查权限（只有评论作者或文章作者可以删除）
        if request.user != comment.author and request.user != comment.article.author:
            return JsonResponse({'status': 'fail', 'msg': _('没有权限删除此评论')})
        #lsx 删除评论
        comment.delete()
        #lsx 清除缓存
        cache.clear()
        #lsx 返回成功响应
        return JsonResponse({'status': 'success', 'msg': _('评论删除成功')})

#lsx 审核评论视图（管理员功能）
class CommentReviewView(LoginRequiredMixin, View):
    #lsx 审核评论
    def post(self, request, comment_id):
        #lsx 检查是否为管理员
        if not request.user.is_superuser:
            return JsonResponse({'status': 'fail', 'msg': _('没有权限审核评论')})
        #lsx 获取评论对象
        comment = get_object_or_404(Comment, id=comment_id)
        #lsx 设置评论为已启用
        comment.is_enable = True
        #lsx 保存评论
        comment.save()
        #lsx 清除缓存
        cache.clear()
        #lsx 返回成功响应
        return JsonResponse({'status': 'success', 'msg': _('评论审核通过')})

#lsx 获取评论统计信息
class CommentStatsView(View):
    #lsx 获取评论统计
    def get(self, request):
        #lsx 获取总评论数
        total_comments = Comment.objects.filter(is_enable=True).count()
        #lsx 获取今日评论数
        today = timezone.now().date()
        today_comments = Comment.objects.filter(
            is_enable=True, create_time__date=today).count()
        #lsx 获取待审核评论数
        pending_comments = Comment.objects.filter(is_enable=False).count()
        #lsx 返回统计数据
        return JsonResponse({
            'total_comments': total_comments,
            'today_comments': today_comments,
            'pending_comments': pending_comments
        })
