package org.lym.pom.repository.mongo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
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;

/**
 * 一个用户对另一个用户的状态/评论进行互动的载体，如赞、喜欢、反对
 *
 * @author lym
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = Attitude.COLLECTION_NAME)
public class Attitude implements Serializable {

    public static final String COLLECTION_NAME = "attitude";

    /**
     * id
     */
    @Id
    private String id;

    /**
     * 所属对象 id，可以是文章、评论的
     *
     * @see RelatedType
     */
    @Indexed
    private String relatedId;
    /**
     * 所属对象类型，如文章、动态、视频等，冗余信息用于扩展与提高读性能
     *
     * @see RelatedType
     */
    @Field
    private String relatedType;
    /**
     * 所属对象的创建人id，冗余信息用于提高读性能
     * 赞通知触发后，给对应人发被赞通知使用，减少查库
     */
    @Field
    private String relatedUserId;
    /**
     * 类型
     *
     * @see Type
     */
    @Field
    private String type;

    /**
     * 操作人
     */
    @Field
    private String creator;

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

    /**
     * 互动对象类型
     * 用户状态/分享
     * 视频
     * 照片
     */
    public enum RelatedType {
        COMMENT("C", Comment.COLLECTION_NAME, Comment.class),
        MOMENT("M", Post.COLLECTION_NAME, Post.class),
        PHOTO("P", "XXX", Comment.class),
        ;
        String   storageValue;
        String   collectionName;
        Class<?> modelClass;

        RelatedType(String storageValue, String collectionName, Class<?> clazz) {
            this.storageValue = storageValue;
            this.collectionName = collectionName;
            this.modelClass = clazz;
        }

        /**
         * Getter method for property <tt>storageValue</tt>.
         *
         * @return property value of storageValue
         */
        public String getStorageValue() {
            return storageValue;
        }

        /**
         * Getter method for property <tt>collectionName</tt>.
         *
         * @return property value of collectionName
         */
        public String getCollectionName() {
            return collectionName;
        }

        /**
         * Getter method for property <tt>modelClass</tt>.
         *
         * @return property value of modelClass
         */
        public Class<?> getModelClass() {
            return modelClass;
        }

        public static RelatedType ofStorageValue(String storageValue) {
            for (RelatedType relatedType : RelatedType.values()) {
                if (relatedType.getStorageValue().equals(storageValue)) {
                    return relatedType;
                }
            }
            return null;
        }
    }

    /**
     * 互动类型：评论、赞、喜欢、反对、举报
     */
    public interface Type {
        String LIKE    = "L";
        String LOVE    = "LO";
        String DISLIKE = "D";
    }
}
