package org.lym.pom.dto.posts;

import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.lym.pom.repository.mongo.Post;
import org.lym.pom.repository.mongo.enums.PostStatusEnum;
import org.lym.pom.repository.mongo.enums.PostTypeEnum;
import org.lym.pom.repository.mongo.enums.PostVisibilityEnum;
import org.shoulder.web.template.dictionary.dto.DictionaryItemDTO;
import org.shoulder.web.template.dictionary.validation.DictionaryEnumItem;

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

/**
 *
 * @see Post
 * @author lym
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PostDTO implements Serializable {

    /**
     * id
     */
    private String id;
    /**
     * 动态类型：分享视频、链接、问卷、话题、动态、状态、时刻等
     */
    @NotEmpty(message = "动态类型 不能为空")
    @DictionaryEnumItem(value = PostTypeEnum.class)
    private DictionaryItemDTO type;
    /**
     * 可见性
     * 公开、私密、好友、仅部分好友（支持选分组）
     * @see Post#Visibility
     */
    @NotEmpty(message = "可见性 不能为空")
    @DictionaryEnumItem(value = PostVisibilityEnum.class)
    private DictionaryItemDTO visibility;
    /**
     * 附加：仅以下部分好友可见
     */
    private List<String> aviliableUserIdList;
    /**
     * 附加：以下分组/标签好友可见
     */
    private List<String> aviliableUserTagList;
    /**
     * 附加：以下部分好友不可见
     */
    private List<String> invisibleUserIdList;
    /**
     * 附加：以下分组/标签好友不可见
     */
    private List<String> invisibleUserTagList;
    /**
     * 发布人
     */
    @NotEmpty(message = "发布人 不能为空")
    private String creator;

    /**
     * 标题
     */
    @NotEmpty(message = "标题 不能为空")
    private String title;
    /**
     * 内容
     */
    @NotEmpty(message = "内容 不能为空")
    private String content;

    /**
     * 媒体信息（图片、视频、声音等）
     */
    private List<String> mediaInfoList;

    /**
     * 关联话题
     */
    private List<String> hashtags;
    /**
     * 动态标签
     */
    private List<String> tags;

    /**
     * 发布设备相关信息
     */
    @NotEmpty(message = "发布设备相关信息 不能为空")
    private String device;
    /**
     * 发布时的位置-经度
     */
    private String longitude;
    /**
     * 发布时的位置-维度
     */
    private String latitude;
    /**
     * 定位标签
     */
    private String locationName;

    // 下面的冗余字段一般无需在创建或更新时提供，在返回数据给前端展示时使用

    // 冗余：赞数量
    private int likeNumber;
    // 冗余：踩数量
    private int dislikeNumber;
    // 冗余：收藏/喜欢数量
    private int loveNumber;
    // 冗余：评论数量
    private int commentNumber;
    // 冗余：转发、分享数量
    private int shareNumber;
    // 冗余：访问量
    private int readNumber;

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

    /**
     * 状态
     */
    @DictionaryEnumItem(value = PostStatusEnum.class)
    private DictionaryItemDTO status;

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

}
