package com.sikey.wa04.common.enums;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.List;

/**
 * 消息类型
 *
 * @author luoyangwei
 * @date 2024年10月12日14:56:40
 */
@AllArgsConstructor
@Getter
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MessageType {
    /**
     * 心跳消息, 保持活跃的消息
     */
    HEARTBEAT_MESSAGES(1, ""),
    /**
     * ack 消息，服务器和客户端双方约定收到消息后的回执消息
     */
    ACK_MESSAGES(2, ""),
    /**
     * 语聊文本消息
     */
    CHAT_TEXT_MESSAGE(20, "publish.chat.text"),
    /**
     * 语聊元数据消息，语聊视频消息
     */
    CHAT_VIDEO_MESSAGE(21, "publish.chat.video"),
    /**
     * 语聊元数据消息，语聊语音消息
     */
    CHAT_VOICE_MESSAGE(22, "publish.chat.voice"),
    /**
     * 语聊元数据消息，语聊表情消息
     */
    CHAT_EMOJI_MESSAGE(23, "publish.chat.emoji"),
    /**
     * 语聊元数据消息，语聊图片消息
     */
    CHAT_IMAGE_MESSAGE(24, "publish.chat.image"),
    /**
     * 设备绑定状态变更消息，设备绑定状态变更的消息，一般由 App 发起绑定或解绑设备时出现
     */
    DEVICE_BIND_STATE_CHANGE_MESSAGE(30, "publish.notice.device-bind-state-change"),
    /**
     * 定位点位变动消息，手表设备上报了点位后会将此消息推送给有权限查看到小孩位置的监护人
     */
    LOCATION_POINT_CHANGE_MESSAGE(31, "publish.notice.location-point-change"),
    /**
     * 添加好友加过通知消息，两只手表互相通过好友 Code 加上好友后，相加的两人会收到这条消息
     */
    ADD_FRIEND_NOTICE_MESSAGE(32, "publish.notice.add-friend"),
    /**
     * 联系人变更通知消息，当小孩联系人数据变动时，这条消息会发送给手表设备和 App
     */
    CONTACT_CHANGE_NOTICE_MESSAGE(33, "publish.notice.contact-change"),
    /**
     * 闹钟变更通知消息，当小孩闹钟消息数据变动时，这条消息只会发送给手表设备
     */
    ALARM_CLOCK_CHANGE_NOTICE_MESSAGE(34, "publish.notice.alarm-clock-change"),
    /**
     * 上课禁用变更通知消息，当小孩的上课禁用数据变动时，这条消息只会发送给手表设备
     */
    SCHOOL_DISABLE_CHANGE_NOTICE_MESSAGE(35, "publish.notice.school-disable-change"),
    /**
     * 手表开机通知消息，手表开机时，这条消息会推中给 App
     */
    WRISTWATCH_STARTUP_NOTICE_MESSAGE(36, "publish.notice.wristwatch-startup"),
    /**
     * 手表关机通知消息，手表关机时，这条消息会推中给 App
     */
    WRISTWATCH_SHUTDOWN_NOTICE_MESSAGE(37, "publish.notice.wristwatch-shutdown"),
    /**
     * 拒接陌生人变动通知消息，当小孩的拒接陌生人了开关数据变动时，这条消息只会发送给手表设备
     */
    REJECT_STRANGER_CHANGE_NOTICE_MESSAGE(38, "publish.notice.reject-stranger-change"),
    /**
     * 消息中心变动通知消息，当监护人消息中心数据变动时，这条消息只会发送给 App
     */
    MESSAGE_CENTER_CHANGE_NOTICE_MESSAGE(39, "publish.notice.message-center-change"),
    /**
     * 视频来电通知消息
     */
    VIDEO_CALL_IN_NOTICE_MESSAGE(40, "publish.notice.video-call-in"),
    /**
     * 视频挂断通知消息
     */
    VIDEO_CALL_OUT_NOTICE_MESSAGE(41, "publish.notice.video-call-out"),
    /**
     * 询问设备位置通知消息
     */
    ASK_LOCATION_POINT_NOTICE_MESSAGE(50, "publish.notice.ask-location-point"),
    /**
     * 远程控制手表重启, 手表收到此消息后会重启
     */
    REMOTE_CONTROL_REBOOT_NOTICE_MESSAGE(60, "publish.notice.remote-control-reboot"),
    /**
     * 远程控制手表关机，手表收到此消息后会关机
     */
    REMOTE_CONTROL_SHUTDOWN_NOTICE_MESSAGE(61, "publish.notice.remote-control-shutdown"),
    /**
     * 设置应用管理应用开关的通知消息，发送给手表
     */
    REMOTE_APP_MANAGE_APP_SWITCH_NOTICE_MESSAGE(62, "publish.notice.app-manage-app-switch"),
    /**
     * 远程控制手表恢复出厂设置通知消息，发送给手表
     */
    REMOTE_CONTROL_RESTORE_FACTORY_SETTINGS_NOTICE_MESSAGE(63, "publish.notice.remote-control-restore-factory-settings"),

    // 移动云盘业务

    /**
     * 通知家长授权
     */
    NOTIFY_PARENTS_AUTHORIZATION(70, "publish.notice.notify-parents-authorization"),

    /**
     * 开通成功通知家长
     */
    NOTIFY_PARENTS_SUCCESSFUL_ACTIVATION(71, "publish.notice.notify-parents-successful-activation"),

    /**
     * 手表退出后 通知手表重新登录
     */
    RELOGIN_ON_WWATCH(72, "publish.notice.relogin-on-watch"),

    /**
     * 手表暂未开通云相册服务，通知手表开通
     */
    ACTIVATE_CLOUD_PHOTO_ALBUM_SERVICE(73, "publish.notice.activate-cloud-photo-album-service"),

    //围栏业务占用1000-1099
    /**
     * 电子围栏-离开-安全围栏的消息通知，推送APP端
     */
    LOCATION_EXIT_SAFETY_FENCE_NOTICE_MESSAGE(1000, "publish.notice.location_exit_safety_fence"),

    /**
     * 电子围栏-进入-危险围栏的通知，推送APP端
     */
    LOCATION_ENTER_DANGER_FENCE_NOTICE_MESSAGE(1001, "publish.notice.location_enter_danger_fence"),

    //设备业务占用1100-1199
    /**
     * 设备-低电通知，推送APP端
     */
    DEVICE_LOW_BATTERY_NOTICE_MESSAGE(1100, "publish.notice.device_low_battery"),
    ;

    @JsonValue
    private final Integer value;
    private final String routingKey;

    /**
     * 根据 value 获取 MessageType
     *
     * @param value value
     * @return MessageType
     */
    public static MessageType valueOfMsg(Integer value) {
        for (MessageType messageType : MessageType.values()) {
            if (messageType.value.equals(value)) {
                return messageType;
            }
        }
        throw new RuntimeException("Invalid MessageType value: " + value);
    }

    /**
     * 获取全部的聊天相关消息类型列表，新增聊天相关类型都需要在此添加
     *
     * @return chatMsgTypeList 聊天消息类型列表
     */
    public static List<Integer> getChatMsgTypes() {
        return List.of(CHAT_TEXT_MESSAGE.getValue(), CHAT_VIDEO_MESSAGE.getValue(), CHAT_VOICE_MESSAGE.getValue(), CHAT_EMOJI_MESSAGE.getValue(), CHAT_IMAGE_MESSAGE.getValue());
    }

    /**
     * 是否加入离线队列的消息类型白名单
     *
     * @return chatMsgTypeList 聊天消息类型列表
     */
    public static List<Integer> OfflineQueueFilterMessageTypes() {
        return List.of(CHAT_TEXT_MESSAGE.getValue(), CHAT_VIDEO_MESSAGE.getValue(), CHAT_VOICE_MESSAGE.getValue(), CHAT_EMOJI_MESSAGE.getValue(), CHAT_IMAGE_MESSAGE.getValue(),
                LOCATION_EXIT_SAFETY_FENCE_NOTICE_MESSAGE.getValue(), LOCATION_ENTER_DANGER_FENCE_NOTICE_MESSAGE.getValue(), DEVICE_LOW_BATTERY_NOTICE_MESSAGE.getValue(),
                VIDEO_CALL_IN_NOTICE_MESSAGE.getValue(), VIDEO_CALL_OUT_NOTICE_MESSAGE.getValue()
        );
    }
}
