package org.lym.pom.dto.posts;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.lym.pom.repository.mongo.enums.CommentRelatedTypeEnum;
import org.lym.pom.repository.mongo.enums.CommentStatusEnum;
import org.lym.pom.repository.mongo.enums.CommentTypeEnum;
import org.shoulder.core.dto.response.PageResult;
import org.shoulder.validate.annotation.group.AddGroup;
import org.shoulder.validate.annotation.group.UpdateGroup;
import org.shoulder.web.template.dictionary.dto.DictionaryItemDTO;
import org.shoulder.web.template.dictionary.validation.DictionaryEnumItem;

import java.io.Serializable;
import java.util.List;

/**
 * @author lym
 */
@Data
public class CommentDTO implements Serializable {

    /**
     * id
     */
    private String id;

    /**
     * 所属对象 id，可以是文章的
     * 评论的评论，该值仍然为被评论对象id
     */
    @NotBlank(groups = AddGroup.class)
    private String relatedId;

    /**
     * 所属对象类型，如文章、动态、视频等，冗余信息用于扩展与提高读性能
     *
     * @see RelatedType
     */
    @NotNull(groups = AddGroup.class, message = "评论对象类型 不能为空")
    @DictionaryEnumItem(value = CommentRelatedTypeEnum.class)
    private DictionaryItemDTO relatedType;

    /**
     * 所属对象的创建人id，冗余信息用于提高读性能
     * 评论通知触发后，给对应人发被评论消息通知使用，减少查库
     */
    private String relatedUserId;
    // ------------------

    /**
     * 父节点id，默认无；评论最多2级。
     * 评论A的评论B：commentA.id
     * 评论A的评论B的评论C：commentA.id，但 parentId = commentB.id && mentionedUserId 一定包含 commentB.userId
     */
    private String rootCommentId;

    /**
     * 根节点的创建人id，冗余信息用于提高读性能
     * 评论通知触发后，给对应人发被评论消息通知使用，减少查库
     */
    private String rootCommentUserId;

    /**
     * 直接父级评论id / 引用的评论 id
     * referUserId 在 mentionedUserIdList 中
     */
    private String parentId;

    /**
     * 类型：content 类型
     *
     * @see Type
     */
    @DictionaryEnumItem(value = CommentTypeEnum.class)
    private DictionaryItemDTO type;

    /**
     * 评论人
     */
    private String creator;

    /**
     * 内容
     */
    @NotBlank(groups = { AddGroup.class, UpdateGroup.class })
    private String content;

    /**
     * 被@到的UserId
     */
    private List<String> mentionedUserIdList;

    /**
     * 发布时的位置-经度
     */
    private String longitude;

    /**
     * 发布时的位置-维度
     */
    private String latitude;

    /**
     * 定位标签
     */
    private String locationName;

    // ==========================热数据==========================
    /**
     * 冗余：赞数量
     */
    private int likeNumber;

    /**
     * 冗余：踩数量
     */
    private int dislikeNumber;

    /**
     * 冗余：阅读量
     */
    private int               readNumber;
    // ==========================热数据==========================
    /**
     * 状态
     *
     * @see Status
     */
    @DictionaryEnumItem(value = CommentStatusEnum.class)
    private DictionaryItemDTO status;

    /**
     * relatedUser 发布者点赞了
     */
    //    private boolean relatedUserLike;

    /**
     * 发布者回复了
     */
    //    private boolean relatedUserReply;

    /**
     * 推荐评分（推荐系统打分，便于推荐优秀的评论）
     */
    private Double score;

    /**
     * 创建时间
     */
    private Long createTime;

    /**
     * 创建时间
     */
    private Long updateTime;

    /**
     * 子评论
     */
    //@Field
    private transient PageResult<CommentDTO> subComments;
}