package com.zanxiang.game.module.manage.pojo.dto;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.zanxiang.erp.security.util.SecurityUtil;
import com.zanxiang.game.module.manage.enums.KfRoomMsgTypeEnum;
import com.zanxiang.game.module.manage.enums.KfWebSocketMsgEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @author : lingfeng
 * @time : 2024-02-26
 * @description : WebSocket客服消息通信返回
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class KfWebSocketMsgDTO {

    /**
     * webSocket消息类型
     */
    private KfWebSocketMsgEnum webSocketMsgType;

    /**
     * 客服id, 存在 : 表示该消息发送给指定客服, 不存在 : 表示该消息发送给所有在线客服
     */
    private Long kfUserId;

    /**
     * 分页信息
     */
    private PageBean page;

    /**
     * 游戏id
     */
    private Long gameId;

    /**
     * 房间id
     */
    private Long roomId;

    /**
     * 结果信息
     */
    private ResultBean result;

    /**
     * 最新待接入玩家信息
     */
    private WaitUserBean lastWaitUser;

    /**
     * 游戏列表, 全量不分页
     */
    private List<GameBean> gameList;

    /**
     * 待接入列表, 全量不分页
     */
    private List<WaitUserBean> waitUserList;

    /**
     * 房间列表, 已接入房间全量返回, 已经结束房间分页返回, 配套返回 page 信息
     */
    private List<RoomBean> roomList;

    /**
     * 房间消息 : 房间消息推送和历史消息列表都用该字段, 历史消息列表会配套返回 page 信息
     */
    private List<RoomMsgBean> roomMsgList;

    /**
     * 玩家信息
     */
    private UserBean user;

    /**
     * 角色列表
     */
    private List<GameRoleBean> roleList;

    /**
     * 订单列表
     */
    private List<OrderBean> orderList;

    /**
     * 快捷回复列表
     */
    private List<QuickReplyBean> quickReplyList;

    public KfWebSocketMsgDTO(KfWebSocketMsgEnum webSocketMsgType, Integer errorCode, String errorMsg) {
        this.webSocketMsgType = webSocketMsgType;
        this.kfUserId = SecurityUtil.getUserId();
        this.result = ResultBean.builder()
                .errorCode(errorCode)
                .errorMsg(errorMsg)
                .build();
    }

    public static KfWebSocketMsgDTO ok(KfWebSocketMsgEnum webSocketMsgType) {
        return new KfWebSocketMsgDTO(webSocketMsgType, 0, "success");
    }

    public static KfWebSocketMsgDTO fail(KfWebSocketMsgEnum webSocketMsgType, String errorMsg) {
        return new KfWebSocketMsgDTO(webSocketMsgType, 400, errorMsg);
    }

    public static KfWebSocketMsgDTO.PageBean transformPage(Page<?> pageBean) {
        return KfWebSocketMsgDTO.PageBean.builder()
                .pageNum(pageBean.getCurrent())
                .pageSize(pageBean.getSize())
                .pageTotal(pageBean.getPages())
                .total(pageBean.getTotal())
                .build();
    }

    public static KfWebSocketMsgDTO.PageBean defaultPage(Long pageNum, Long pageSice) {
        return KfWebSocketMsgDTO.PageBean.builder()
                .pageNum(pageNum)
                .pageSize(pageSice)
                .pageTotal(0L)
                .total(0L)
                .build();
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class QuickReplyBean {

        /**
         * 主键id
         */
        private Long id;

        /**
         * 内容
         */
        private String content;
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class UserBean {

        /**
         * 玩家id
         */
        private Long userId;

        /**
         * 最近角色id
         */
        private String lastRoleId;

        /**
         * 最近角色名称
         */
        private String lastRoleName;

        /**
         * 角色服务器id
         */
        private String serverId;

        /**
         * 角色服务器名称
         */
        private String serverName;

        /**
         * 充值笔数
         */
        private Integer orderCount;

        /**
         * 最大充值金额
         */
        private BigDecimal orderMaxAmount;

        /**
         * 累计充值金额
         */
        private BigDecimal orderAmountSum;

        /**
         * 最后充值时间
         */
        private LocalDateTime lastPayTime;

        /**
         * 是否添加企微
         */
        private Boolean addCorpWechat;
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class GameRoleBean {

        /**
         * 玩家id
         */
        private Long userId;

        /**
         * 最近角色id
         */
        private String roleId;

        /**
         * 最近角色名称
         */
        private String roleName;

        /**
         * 角色服务器id
         */
        private String serverId;

        /**
         * 角色服务器名称
         */
        private String serverName;

        /**
         * 角色等级
         */
        private Long roleLevel;

        /**
         * 玩家角色战力
         */
        private Long rolePower;

        /**
         * 角色创建时间
         */
        private LocalDateTime createTime;
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class OrderBean {

        /**
         * 玩家id
         */
        private Long userId;

        /**
         * 订单id
         */
        private String orderId;

        /**
         * 角色id
         */
        private String roleId;

        /**
         * 角色名称
         */
        private String roleName;

        /**
         * 角色服务器id
         */
        private String serverId;

        /**
         * 角色服务器名称
         */
        private String serverName;

        /**
         * 游戏商品名称
         */
        private String productName;

        /**
         * 充值金额
         */
        private BigDecimal amount;

        /**
         * 下单时间
         */
        private LocalDateTime createTime;

        /**
         * 支付时间
         */
        private LocalDateTime payTime;
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class GameBean {

        /**
         * 游戏id
         */
        private Long gameId;

        /**
         * 小程序名称
         */
        private String appName;

        /**
         * 未读消息总数
         */
        private Long unReadMsgCount;
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class WaitUserBean {

        /**
         * 玩家openId
         */
        private String openId;

        /**
         * 消息游戏id
         */
        private Long gameId;

        /**
         * 最近角色id
         */
        private String lastRoleId;

        /**
         * 最近角色名称
         */
        private String lastRoleName;

        /**
         * 未读消息列表
         */
        private List<WaitUserMsgBean> waitUserMsgList;

        /**
         * 未读消息总数
         */
        private Long unReadMsgCount;

        /**
         * 开始等待时间
         */
        private LocalDateTime waitStartTime;

        /**
         * 是否添加企微
         */
        private Boolean addCorpWechat;
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class WaitUserMsgBean {

        /**
         * 消息id
         */
        private String msgId;

        /**
         * 消息类型
         */
        private String msgType;

        /**
         * 创建时间
         */
        private LocalDateTime createTime;

        /**
         * 消息内容
         */
        private String content;

    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class RoomBean {

        /**
         * 房间id
         */
        private Long roomId;

        /**
         * 消息游戏id
         */
        private Long gameId;

        /**
         * 玩家open_id
         */
        private String openId;

        /**
         * 最近角色id
         */
        private String lastRoleId;

        /**
         * 最近角色名称
         */
        private String lastRoleName;

        /**
         * 客服id
         */
        private Long kfUserId;

        /**
         * 房间在线状态
         */
        private Boolean online;

        /**
         * 消息归属
         */
        private String msgOwner;

        /**
         * 最后一条消息
         */
        private String lastMsg;

        /**
         * 最后一条消息时间
         */
        private LocalDateTime lastMsgTime;

        /**
         * 未读消息总数
         */
        private Long unReadMsgCount;

        /**
         * 是否添加企微
         */
        private Boolean addCorpWechat;
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class RoomMsgBean {

        /**
         * 消息id
         */
        private String msgId;

        /**
         * 消息类型
         */
        private KfRoomMsgTypeEnum msgType;

        /**
         * 消息游戏id
         */
        private Long gameId;

        /**
         * 房间id
         */
        private Long roomId;

        /**
         * 已读状态
         */
        private Boolean readStatus;

        /**
         * 客服id, 当消息归属于客服得时候有值
         */
        private Long kfUserId;

        /**
         * 客服名称, 当消息归属于客服得时候有值
         */
        private String kfUserName;

        /**
         * 消息归属
         */
        private String msgOwner;

        /**
         * 消息内容
         */
        private MsgContentBean content;

        /**
         * 创建时间
         */
        private LocalDateTime createTime;
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class MsgContentBean {

        /**
         * 文本内容
         */
        private String text;

        /**
         * 图片地址
         */
        private String image;

        /**
         * 图文消息
         */
        private LinkBean link;

        /**
         * 小程序消息
         */
        private MiniAppBean miniprogrampage;
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class MiniAppBean {

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

        /**
         * 小程序id
         */
        private String appId;

        /**
         * 路径
         */
        private String pagePath;

        /**
         * 图片地址
         */
        private String thumbUrl;
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class LinkBean {

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

        /**
         * 描述
         */
        private String description;

        /**
         * 跳转链接
         */
        private String url;

        /**
         * 图片地址
         */
        @JsonProperty("thumb_url")
        private String thumbUrl;
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class PageBean {

        /**
         * 当前页数
         */
        private Long pageNum;

        /**
         * 单页数量
         */
        private Long pageSize;

        /**
         * 总页数
         */
        private Long pageTotal;

        /**
         * 数据总量
         */
        private Long total;
    }

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class ResultBean {

        /**
         * 0 : 成功, 其他失败
         */
        private Integer errorCode;

        /**
         * 错误消息
         */
        private String errorMsg;
    }

}
