#lsx 评论模型定义

from django.db import models
from django.contrib.auth import get_user_model
from django.urls import reverse
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

#lsx 评论模型，用于存储用户对文章的评论
class Comment(models.Model):
    #lsx 评论状态：待审核和已启用
    STATUS = (('n', _('Pending')), ('p', _('Published')))
    #lsx 评论正文
    body = models.TextField(_('comment content'), max_length=2000)
    #lsx 评论者邮箱（未登录用户）
    email = models.EmailField(_('email address'), max_length=100, blank=True, null=True)
    #lsx 评论者用户名（未登录用户）
    name = models.CharField(_('name'), max_length=50, blank=True, null=True)
    #lsx 评论者网址（未登录用户）
    url = models.URLField(_('url'), blank=True, null=True, max_length=100)
    #lsx 评论状态
    status = models.CharField(
        _('status'), max_length=1, choices=STATUS, default='n')
    #lsx 评论时间
    create_time = models.DateTimeField(_('create time'), default=timezone.now)
    #lsx 是否启用
    is_enable = models.BooleanField(_('is enable'), default=False)
    #lsx 评论所属文章
    article = models.ForeignKey(
        'blog.Article', verbose_name=_('article'), on_delete=models.CASCADE)
    #lsx 评论作者（外键关联用户）
    author = models.ForeignKey(
        get_user_model(),
        verbose_name=_('author'),
        blank=True,
        null=True,
        on_delete=models.CASCADE)
    #lsx 父评论（用于回复功能）
    parent_comment = models.ForeignKey(
        'self',
        verbose_name=_('parent comment'),
        blank=True,
        null=True,
        on_delete=models.CASCADE)

    #lsx 返回评论内容的前20个字符作为对象的字符串表示
    def __str__(self):
        return self.body[:20]

    class Meta:
        ordering = ['create_time']  #lsx 按创建时间排序
        verbose_name = _('comment')  #lsx 在管理后台显示的名称
        verbose_name_plural = _('comments')  #lsx 复数形式

    #lsx 获取评论的绝对URL
    def get_absolute_url(self):
        return reverse('blog:article_detail', kwargs={'article_id': self.article_id})

    #lsx 获取评论在管理后台的编辑URL
    def get_admin_url(self):
        return reverse('admin:comments_comment_change', kwargs={'object_id': self.id})

    #lsx 保存评论时的逻辑处理
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        #lsx 如果是回复评论，自动设置为已启用
        if self.parent_comment:
            self.is_enable = True
        super().save(*args, **kwargs)

#lsx 回复评论模型（备选方案，目前使用自关联方式实现回复）
class Reply(models.Model):
    #lsx 回复内容
    content = models.TextField(_('reply content'), max_length=1000)
    #lsx 回复时间
    create_time = models.DateTimeField(_('create time'), default=timezone.now)
    #lsx 回复所属评论
    comment = models.ForeignKey(Comment, verbose_name=_('comment'), on_delete=models.CASCADE)
    #lsx 回复作者
    author = models.ForeignKey(
        get_user_model(), verbose_name=_('author'), on_delete=models.CASCADE)

    #lsx 返回回复内容的前20个字符作为对象的字符串表示
    def __str__(self):
        return self.content[:20]

    class Meta:
        ordering = ['create_time']  #lsx 按创建时间排序
        verbose_name = _('reply')  #lsx 在管理后台显示的名称
        verbose_name_plural = _('replies')  #lsx 复数形式

#lsx 评论配置模型（可选，用于存储评论相关设置）
class CommentConfig(models.Model):
    #lsx 是否开启评论功能
    is_open = models.BooleanField(_('is open'), default=True)
    #lsx 是否需要审核
    need_review = models.BooleanField(_('need review'), default=True)
    #lsx 配置更新时间
    update_time = models.DateTimeField(_('update time'), default=timezone.now)

    #lsx 返回配置标识
    def __str__(self):
        return 'Comment Configuration'

    class Meta:
        verbose_name = _('comment configuration')  #lsx 在管理后台显示的名称
        verbose_name_plural = verbose_name  #lsx 复数形式

    #lsx 保存配置时更新时间
    def save(self, *args, **kwargs):
        self.update_time = timezone.now()
        super().save(*args, **kwargs)

#lsx 评论统计模型（可选，用于统计评论数据）
class CommentStats(models.Model):
    #lsx 文章ID
    article_id = models.IntegerField(_('article id'), unique=True)
    #lsx 评论总数
    comment_count = models.IntegerField(_('comment count'), default=0)
    #lsx 已启用评论数
    enabled_count = models.IntegerField(_('enabled count'), default=0)
    #lsx 最后评论时间
    last_comment_time = models.DateTimeField(_('last comment time'), null=True, blank=True)

    #lsx 返回文章ID和评论数
    def __str__(self):
        return f'Article {self.article_id}: {self.comment_count} comments'

    class Meta:
        ordering = ['-comment_count']  #lsx 按评论数倒序排序
        verbose_name = _('comment statistics')  #lsx 在管理后台显示的名称
        verbose_name_plural = verbose_name  #lsx 复数形式

#lsx 评论通知模型（可选，用于通知功能）
class CommentNotification(models.Model):
    #lsx 通知类型：评论、回复
    TYPE = (('c', _('Comment')), ('r', _('Reply')))
    #lsx 通知状态：未读、已读
    STATUS = (('u', _('Unread')), ('r', _('Read')))
    #lsx 通知类型
    notification_type = models.CharField(
        _('notification type'), max_length=1, choices=TYPE, default='c')
    #lsx 通知状态
    status = models.CharField(
        _('status'), max_length=1, choices=STATUS, default='u')
    #lsx 通知时间
    create_time = models.DateTimeField(_('create time'), default=timezone.now)
    #lsx 相关评论
    comment = models.ForeignKey(Comment, verbose_name=_('comment'), on_delete=models.CASCADE)
    #lsx 接收通知的用户
    recipient = models.ForeignKey(
        get_user_model(), verbose_name=_('recipient'), on_delete=models.CASCADE)

    #lsx 返回通知信息
    def __str__(self):
        return f'Notification for {self.recipient}: {self.comment.body[:20]}'

    class Meta:
        ordering = ['-create_time']  #lsx 按创建时间倒序排序
        verbose_name = _('comment notification')  #lsx 在管理后台显示的名称
        verbose_name_plural = verbose_name  #lsx 复数形式

#lsx 评论点赞模型（可选，用于点赞功能）
class CommentLike(models.Model):
    #lsx 点赞时间
    create_time = models.DateTimeField(_('create time'), default=timezone.now)
    #lsx 点赞的评论
    comment = models.ForeignKey(Comment, verbose_name=_('comment'), on_delete=models.CASCADE)
    #lsx 点赞的用户
    user = models.ForeignKey(
        get_user_model(), verbose_name=_('user'), on_delete=models.CASCADE)

    #lsx 返回点赞信息
    def __str__(self):
        return f'{self.user} likes comment {self.comment.id}'

    class Meta:
        unique_together = ('comment', 'user')  #lsx 一个用户只能给一个评论点赞一次
        verbose_name = _('comment like')  #lsx 在管理后台显示的名称
        verbose_name_plural = verbose_name  #lsx 复数形式
