package com.seer.teach.netty.common.proto;

/**
 * <p>@ProjectName:     NettyChat</p>
 * <p>@ClassName:       MessageType.java</p>
 * <p>@PackageName:     com.freddy.chat.im</p>
 * <b>
 * <p>@Description:     消息类型</p>
 * </b>
 * <p>@author:          FreddyChen</p>
 * <p>@date:            2019/04/08 00:04</p>
 * <p>@email:           chenshichao@outlook.com</p>
 */
public enum MessageType {

    /*
     * 握手消息
     */
    HANDSHAKE(1001),

    /*
     * 心跳消息
     */
    HEARTBEAT(1002),

    /*
     * 客户端提交的消息接收状态报告
     */
    CLIENT_MSG_RECEIVED_STATUS_REPORT(1009),

    /*
     * 服务端返回的消息发送状态报告
     */
    SERVER_MSG_SENT_STATUS_REPORT(1010),

    /**
     * 单聊消息
     */
    SINGLE_CHAT(2001),

    /**
     * 群聊消息
     */
    GROUP_CHAT(3001);

    private int msgType;

    MessageType(int msgType) {
        this.msgType = msgType;
    }

    public int getMsgType() {
        return this.msgType;
    }

    public enum MessageContentType {

        /**
         * 遥控home按键键指令
         */
        KEYCODE_HOME(1),

        /**
         * 遥控ok按键指令
         */
        KEYCODE_OK(2),

        /**
         * 遥控返回按键指令
         */
        KEYCODE_BACK(3),

        /**
         * 遥控左按键指令
         */
        KEYCODE_LEFT(4),

        /**
         * 遥控右按键指令
         */
        KEYCODE_RIGHT(5),

        /**
         * 遥控向上按键指令
         */
        KEYCODE_UP(6),

        /**
         * 遥控向下按键指令
         */
        KEYCODE_DOWN(7),
        /**
         * 遥控音量减按键指令
         */
        KEYCODE_VOLUME_UP(8),

        /**
         * 遥控音量加按键指令
         */
        KEYCODE_VOLUME_DOWN(9),

        /**
         * 遥控静音按键指令
         */
        KEYCODE_VOLUME_MUTE(10),

        /**
         * 遥控切换信号源按键指令
         */
        KEYCODE_SWITCH_SOURCES(11),
        /**
         * 遥控关机按键指令
         */
        KEYCODE_SHUTDOWN(12),

        /**
         * tv是否息屏状态报告指令
         */
        TV_SCREEN_AND_VOICE_STATE(13),

        /**
         * 激活成功进入TV首页指令
         */
        ACTIVE_SUCCESS_ENTER_TV(99),

        /**
         * 进入AI分析指令
         */
        ENTER_AI_ANALYSE(100),

        /**
         * 进入AI复习指令
         */
        ENTER_AI_REVIEW(101),

        /**
         * 进入AI预习指令
         */
        ENTER_AI_PREPARE_LESSONS(102),

        /**
         * 进入AI智读指令
         */
        ENTER_AI_SMART_READ(103),

        /**
         * 进入宝箱指令
         */
        ENTER_TREASURE_CHESTS(104),

        /**
         * 进入我的世界指令
         */
        ENTER_MY_WORLD(105),

        /**
         * 进入批改指令
         */
        ENTER_AI_CORRECTION(106),

        /**
         * 批改中指令
         */
        CORRECTING(107),

        /**
         * 批改结果(包括成功或者失败都要返回)指令
         */
        CORRECT_RESULT(108),

        /**
         * 所有跳题index指令(包括题目解析和做题)
         */
        JUMP_INDEX(109),

        /**
         * 更新用户信息指令
         */
        UPDATE_CHILDREN_INFO(110),

        /**
         * 评测提交评分中推送指令
         */
        TEST_GRADING(111),

        /**
         * 评测结果推送指令
         */
        TEST_GRADING_RESULT(112),

        /**
         * 查看解析推送指令
         */
        CHECK_ANALYSIS(113),

        /**
         * 休息一会推送指令
         */
        TAKE_A_BREAK(115),

        /**
         * 接收语音信息指令
         */
        RECEIVE_VOICE_MESSAGES(116),

        /**
         * 批改显示跳转到复习或者预习弹窗的指令
         */
        SHOW_REVIEW_OR_PREPARE(118),

        /**
         * 查看解析指令
         */
        VIEW_THE_ANALYSIS(119),

        /**
         * 错题重做指令
         */
        REDO_THE_WRONG_QUESTION(120),

        /**
         * 游戏长按拖拉角度控制方向指令
         */
        GAME_LONG_PRESS_DIRECTION(121),

        /**
         * 退出游戏指令
         */
        EXIT_GAME(122),

        /**
         * 游戏返回上一层指令
         */
        GAME_BACK_PREVIOUS_LEVEL(123),
        /**
         * 选择游戏类型指令
         */
        GAME_SELECT_TYPE(124),
        /**
         * 游戏确定(A)按键指令
         */
        GAME_OK(125),

        /**
         * 游戏跳跃(B)按键指令
         */
        GAME_JUMP(126),

        /**
         * 游戏上一页按键指令
         */
        GAME_PREVIOUS_PAGE(127),

        /**
         * 游戏下一页按键指令
         */
        GAME_NEXT_PAGE(128),

        /**
         * 语音快速进入测试指令
         */
        ENTER_TEST(129),

        /**
         * 语音快速进入全部试卷指令
         */
        ENTER_ALL_PAPER(130),

        /**
         * 语音快速进入AI报告指令
         */
        ENTER_AI_REPORT(131),

        /**
         * 语音快速进入错题本指令
         */
        ENTER_ERROR_BOOK(132),

        /**
         * 回答思考中指令
         */
        ANSWER_THINKING(133),

        /**
         * 快捷显示黑板指令
         */
        QUICK_DISPLAY_BLACKBOARD(134),

        /**
         * 推送讲课学习时长指令
         */
        SEND_STUDY_DURATION(135),

        /**
         * 关闭sse流指令 type: 0、批改  1、对话   2、讲课  {"type":0}
         */
        CLOSE_CURRENT_STREAM(136),

        /**
         * 接收讲课内容推送指令
         * (这里要携带音频流和知识点数据，包括视频或者富文本，注意，这里对话也是使用这个指令，区分其他模块(140)对话)
         */
        RECEIVE_STUDY_DATA_STREAM(137),

        /**
         * 讲课内容推送失败指令
         */
        RECEIVE_STUDY_DATA_STREAM_ERROR(138),

        /**
         * 每个环节讲完后告诉后台指令
         */
        EACH_LINK_END_PUSH(139),

        /**
         * 接收pcm语音流指令
         * 注意这里用法是除了讲课之外
         */
        RECEIVE_VOICE_STREAM(140),

        /**
         *
         * 讲课结束显示"懂了"、"再讲一次"指令
         */
        STUDY_OVER(142),

        /**
         * 智读、宝箱每个环节讲完后告诉后台指令 传递参数{type:(SMART_READING(5)/
         *     TREASURE_CHESTS_READING(6)), bookPlayState:false/true}
         */
        EACH_LINK_END_PUSH_FOR_SMART_READING_OR_TREASURE_CHESTS(143),

        /**
         * 退出智读、宝箱  {type:(SMART_READING(5)/
         *      *     TREASURE_CHESTS_READING(6))} 指令
         */
        EXIT_SMART_READING_OR_TREASURE_CHESTS(144),


        /**
         *继续智读、宝箱阅读指令 传递参数{type:(SMART_READING(5)/
         *      *     TREASURE_CHESTS_READING(6))}
         */
        CONTINUE_SMART_READING_OR_TREASURE_CHESTS(145),

        /**
         * 语音进入快捷指令
         */
        QUICK_ACCESS_MODULE(100),

        /**
         * 统一错误退出指令
         */
        ERROR(999);

        private int msgContentType;

        public static MessageContentType getEnumByCode(Integer msgContentType) {
            if (msgContentType == null) {
                return null;
            }

            for (MessageContentType type : values()) {
                if (type.getMsgContentType() == msgContentType.intValue()) {
                    return type;
                }
            }

            return null;
        }

        MessageContentType(int msgContentType) {
            this.msgContentType = msgContentType;
        }

        public int getMsgContentType() {
            return this.msgContentType;
        }
    }
}
