package org.lym.pom.repository.mongo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.lym.pom.repository.mongo.enums.PostTypeEnum;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

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

/**
 * 朋友圈 / 状态 / 微博 / 说说这类，用于给用户记录分享当前时刻的类
 * 数据分区：按照时间分区
 * 数据分片：按照userId分片
 *
 * @author lym
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = Post.COLLECTION_NAME)
public class Post implements Serializable {

    public static final String COLLECTION_NAME = "post";

    /**
     * id
     */
    @Id
    private String id;
    /**
     * 关联了其他文章如果有
     */
    @Field
    private String relatedResourceIds;
    /**
     * 分享/引用/转载类使用 userId
     */
    @Field
    private String originalUserId;
    /**
     * 分享/引用/转载类使用
     */
    private String originalId;
    /**
     * 动态类型：分享视频、链接、问答、话题、动态、状态、时刻、讨论、公告等
     * @see PostTypeEnum
     */
    @Field
    private String type;
    /**
     * 分类：如互联网、娱乐、美食、旅行
     * 动态
     */
    @Field
    private String category;
    /**
     * 是否官方、是否置顶、
     */
    @Field
    private Boolean official;

    /**
     * 是否公共置顶
     */
    @Field
    private Boolean pinned;
    /**
     * 是否个人置顶
     */
    @Field
    private Boolean pinnedByAuthor;

    /**
     * 动态自动删除的时间戳，用于限时动态功能
     */
    @Field
    private Long expirationTimestamp;
    /**
     * 设置为精华贴
     */
    @Field
    private Boolean marrow;
    /**
     * 可见性
     * 公开、私密、好友、仅部分好友（支持选分组）
     * @see org.lym.pom.repository.mongo.enums.PostVisibilityEnum
     */
    @Field
    private String visibility;
    /**
     * 附加：仅以下部分好友可见
     */
    @Field
    private List<String> aviliableUserIdList;
    /**
     * 附加：以下分组/标签好友可见
     */
    @Field
    private List<String> aviliableUserTagList;
    /**
     * 附加：以下部分好友不可见
     */
    @Field
    private List<String> invisibleUserIdList;
    /**
     * 附加：以下分组/标签好友不可见
     */
    @Field
    private List<String> invisibleUserTagList;
    /**
     * 发布人
     */
    @Indexed
    private String creator;

    /**
     * 预览
     */
    @Field
    private String preview;

    /**
     * 标题
     */
    @Field
    private String title;

    /**
     * 宣传图片
     */
    @Field
    private String headImg;

    /**
     * 内容格式【新字段】
     */
    @Field
    private String contentType;

    /**
     * 内容
     */
    @Field
    private String content;

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

    /**
     * 关联话题
     */
    @Field
    private List<String> hashtags;
    /**
     * 动态标签
     */
    @Field
    private List<String> tags;
    /**
     * 允许评论
     */
    @Field
    private Boolean allowComments;
    /**
     * 允许转发
     */
    @Field
    private Boolean allowRepost;

    /**
     * 发布设备相关信息
     */
    @Field
    private String device;
    /**
     * 发布时的位置-经度
     */
    @Field
    private String longitude;
    /**
     * 发布时的位置-维度
     */
    @Field
    private String latitude;
    /**
     * 定位标签
     */
    @Field
    private String locationName;

    /**
     * 冗余：赞数量
     */
    @Field
    private int likeNumber;

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

    /**
     * 冗余：收藏/喜欢数量
     */
    @Field
    private int loveNumber;

    /**
     * 冗余：评论数量
     */
    @Field
    private int commentNumber;

    /**
     * 冗余：转发、分享数量
     */
    @Field
    private int shareNumber;

    /**
     * 冗余：访问量
     */
    @Field
    private int readNumber;

    /**
     * 冗余：viewers 看过的人，随机30个
     */
    @Field
    private Set<String> viewers;

    /**
     * 评论id列表
     */
//    @Field
//    private Set<String> comments;

    /**
     * 隐藏原因，仅被禁止的有该字段
     */
    @Field
    private Long lastCommentTime;

    /**
     * 隐藏原因，仅被禁止的有该字段
     */
    @Field
    private String hiddenReasons;

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

    /**
     * 状态
     * @see org.lym.pom.repository.mongo.enums.PostStatusEnum
     */
    @Field
    private String status;

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

    // vo updateAgo

}
