package com.business.socket.bean;

/******************************
 * @Description 消息推送
 * @Author yanhongliang
 * @Date 2019-08-10 10:25
 ******************************/


import com.alibaba.fastjson.JSONObject;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 一个推送的具体Model，内部维持了一个数组，可以添加多个实体
 * 每次推送的详细数据是：把实体数组进行Json操作，然后发送Json字符串
 * 这样做的目的是：减少多次推送，如果有多个消息需要推送可以合并进行
 *
 */
@SuppressWarnings("WeakerAccess")
public class PushModel {
    /**
     * -1   断开连接
     */
    public static final int LOGOUT = -1;
    /**
     * 100 建立连接
     */
    public static final int CONNECT =100;
    /**
     * 101 心跳包
     */
    public static final int KEEPALIVE=101;
    /**
     * 200  消息
     */
    public static final int MESSAGE = 200;
    /**
     * 300  事件
     */
    public static final int EVENT = 300;

    private List<Entity> entities = new ArrayList<>();

    public PushModel add(Entity entity) {
        entities.add(entity);
        return this;
    }

    public PushModel add(int type, String content) {
        return add(new Entity(type, content));
    }

    public String getPushString() {
        if (entities.size() == 0){
            return null;
        }
        return JSONObject.toJSONString(entities);
    }

    /**
     * 具体的实体类型，在这个实体中包装了实体的内容和类型
     * 比如添加好友的推送：
     * content：用户信息的Json字符串
     * type=ENTITY_TYPE_ADD_FRIEND
     */
    public static class Entity<T> {

        public Entity(int type, T data) {
            if (data instanceof Event) {
                this.type = type;
                this.data = data;
            } else {
                this.type = type;
                this.data = data;
            }
        }

        // 消息类型
        public int type;
        // 消息实体
        public T data;
        // 消息生成时间
        public LocalDateTime createAt = LocalDateTime.now();

    }

    public static class Event {

        public Event() {

        }

        public Event(String id, String time, String title, String content,
                     String user, String longitude, String latitude,
                     String type, String status) {
            this.eId = id;
            this.cTime = time;
            this.eTitle = title;
            this.rContent = content;
            this.rUser = user;
            this.eLongitude = longitude;
            this.eLatitude = latitude;
            this.eType = type;
            this.eStatus = status;
        }

        // 事件ID
        public String eId;
        // 时间
        public String cTime;
        // 标题
        public String eTitle;
        // 内容
        public String rContent;
        // 用户
        public String rUser;
        // 经度
        public String eLongitude;
        // 纬度
        public String eLatitude;
        // 状态
        public String eStatus;
        // 类型
        public String eType;

    }

}
