package mq

import pb "google.golang.org/protobuf/proto"

const (
	MsgTypeGame     = iota // 来自客户端的游戏消息
	MsgTypeFight           // 战斗服务器消息
	MsgTypeConnCtrl        // GATE客户端连接信息消息
	MsgTypeServer          // 服务器之间转发的消息
)

type NetMsg struct {
	MsgType           uint8        `msgpack:"MsgType"`
	EventId           uint16       `msgpack:"EventId"`
	ServerType        string       `msgpack:"-"`
	AppId             string       `msgpack:"-"`
	Topic             string       `msgpack:"-"`
	GameMsg           *GameMsg     `msgpack:"GameMsg"`
	FightMsg          *FightMsg    `msgpack:"FightMsg"`
	ConnCtrlMsg       *ConnCtrlMsg `msgpack:"ConnCtrlMsg"`
	ServerMsg         *ServerMsg   `msgpack:"ServerMsg"`
	OriginServerType  string       `msgpack:"OriginServerType"`
	OriginServerAppId string       `msgpack:"OriginServerAppId"`
}

const (
	NormalMsg = iota // 正常的游戏消息
)

type GameMsg struct {
	UserId             uint32     `msgpack:"UserId"`
	CmdId              uint16     `msgpack:"CmdId"`
	ClientSeq          uint32     `msgpack:"ClientSeq"`
	PayloadMessage     pb.Message `msgpack:"-"`
	PayloadMessageData []byte     `msgpack:"PayloadMessageData"`
}

const (
	ClientRttNotify   = iota // 客户端网络时延上报
	ClientTimeNotify         // 客户端本地时间上报
	KickPlayerNotify         // 通知GATE剔除玩家
	UserOfflineNotify        // 玩家离线通知GS
)

type ConnCtrlMsg struct {
	UserId     uint32 `msgpack:"UserId"`
	ClientRtt  uint32 `msgpack:"ClientRtt"`
	ClientTime uint32 `msgpack:"ClientTime"`
	KickUserId uint32 `msgpack:"KickUserId"`
	KickReason uint32 `msgpack:"KickReason"`
}

const (
	AddFightRoutine       = iota // 添加战斗实例
	DelFightRoutine              // 删除战斗实例
	FightRoutineAddEntity        // 战斗实例添加实体
	FightRoutineDelEntity        // 战斗实例删除实体
)

type FightMsg struct {
	FightRoutineId  uint32             `msgpack:"FightRoutineId"`
	EntityId        uint32             `msgpack:"EntityId"`
	FightPropMap    map[uint32]float32 `msgpack:"FightPropMap"`
	Uid             uint32             `msgpack:"Uid"`
	AvatarGuid      uint64             `msgpack:"AvatarGuid"`
	GateServerAppId string             `msgpack:"GateServerAppId"`
}

const (
	ServerAppidBindNotify             = iota // 玩家连接绑定的各个服务器appid通知
	ServerUserOnlineStateChangeNotify        // 广播玩家上线和离线状态以及所在GS的appid
	ServerUserGsChangeNotify                 // 跨服玩家迁移通知
	ServerUserMpReq                          // 跨服多人世界相关请求
	ServerUserMpRsp                          // 跨服多人世界相关响应
	ServerChatMsgNotify                      // 跨服玩家聊天消息通知
	ServerAddFriendNotify                    // 跨服添加好友通知
)

type ServerMsg struct {
	FightServerAppId string         `msgpack:"FightServerAppId"`
	UserId           uint32         `msgpack:"UserId"`
	IsOnline         bool           `msgpack:"IsOnline"`
	GameServerAppId  string         `msgpack:"GameServerAppId"`
	JoinHostUserId   uint32         `msgpack:"JoinHostUserId"`
	UserMpInfo       *UserMpInfo    `msgpack:"UserMpInfo"`
	ChatMsgInfo      *ChatMsgInfo   `msgpack:"ChatMsgInfo"`
	AddFriendInfo    *AddFriendInfo `msgpack:"AddFriendInfo"`
}

type OriginInfo struct {
	CmdName string `msgpack:"CmdName"`
	UserId  uint32 `msgpack:"UserId"`
}

type UserBaseInfo struct {
	UserId         uint32 `msgpack:"UserId"`
	Nickname       string `msgpack:"Nickname"`
	PlayerLevel    uint32 `msgpack:"PlayerLevel"`
	MpSettingType  uint8  `msgpack:"MpSettingType"`
	NameCardId     uint32 `msgpack:"NameCardId"`
	Signature      string `msgpack:"Signature"`
	HeadImageId    uint32 `msgpack:"HeadImageId"`
	WorldPlayerNum uint32 `msgpack:"WorldPlayerNum"`
	WorldLevel     uint32 `msgpack:"WorldLevel"`
}

type UserMpInfo struct {
	OriginInfo            *OriginInfo   `msgpack:"OriginInfo"`
	HostUserId            uint32        `msgpack:"HostUserId"`
	ApplyUserId           uint32        `msgpack:"ApplyUserId"`
	ApplyPlayerOnlineInfo *UserBaseInfo `msgpack:"ApplyPlayerOnlineInfo"`
	ApplyOk               bool          `msgpack:"ApplyOk"`
	Agreed                bool          `msgpack:"Agreed"`
	HostNickname          string        `msgpack:"HostNickname"`
}

type ChatMsgInfo struct {
	Time    uint32 `msgpack:"Time"`
	ToUid   uint32 `msgpack:"ToUid"`
	Uid     uint32 `msgpack:"Uid"`
	IsRead  bool   `msgpack:"IsRead"`
	MsgType uint8  `msgpack:"MsgType"`
	Text    string `msgpack:"Text"`
	Icon    uint32 `msgpack:"Icon"`
}

type AddFriendInfo struct {
	OriginInfo            *OriginInfo   `msgpack:"OriginInfo"`
	TargetUserId          uint32        `msgpack:"TargetUserId"`
	ApplyPlayerOnlineInfo *UserBaseInfo `msgpack:"ApplyPlayerOnlineInfo"`
}
