package msg

import "server/game/mod/item"

type Msg struct {
	Type       int          // 消息类型
	To         int          // 接收者
	From       int          // 发送者
	Item       []*item.Item // 物品
	SendT      int64        // 发送时间
	End        int64        // 过期时间
	Extra      interface{}  //额外信息
	Id         int64
	UniKey     string // 回调监听唯一键值
	H          int    //处理类型
	HandleType int    //处理类型
}

type VarData struct {
	Key     string
	Value   interface{}
	SetType int // 操作类型 0 设置 1 增加 2 减少 3 覆盖
}

const (
	VAR_OP_ADD = 1
	VAR_OP_SUB = 2
	VAR_OP_SET = 3
)

var MSG_ZERO_UPDATE = &Msg{Type: SERVER_ZERO_UPDATE}
var MSG_NOON_UPDATE = &Msg{Type: SERVER_NOON_UPDATE}

const (
	MSG_TYPE_ONLINE  = 0 // 在线消息
	MSG_TYPE_OFFLINE = 1 // 离线消息
)
const (
	HANDLE_MOD_PLAYER_MSG          = 20001 // 玩家消息
	HANDLE_MOD_CLUSTER_MSG         = 20002 // 集群消息
	HANDLE_MOD_PLAYER_LOGIN        = 20003 // 玩家登录消息
	HANDLE_MOD_COMSUME_MSG         = 20004 // 消费消息
	HANDLE_MOD_CLUSTER_SYNC        = 20005 // 集群同步消息
	HANDLE_MDO_PLAYER_LOGOUT       = 20006 // 玩家登出消息
	HANDLE_MOD_VAR_GET             = 20007 // 获取变量
	HANDLE_MOD_VAR_SET             = 20008 // 设置变量
	HANDLE_MOD_CATNIP_PARTNER      = 20009 // 猫薄荷伙伴
	HANDLE_MOD_USER_VAR_GET        = 20010 // 获取玩家变量
	HANDLE_MOD_USER_VAR_SET        = 20011 // 设置玩家变量
	HANDLE_MOD_REPLY_PLAYER_MSG    = 20012 // 回复玩家消息
	HANDLE_MDO_CHAMPSHIP_INRANK    = 20013 // 锦标赛入榜
	HANDLE_MOD_CHAMPSHIP_RANK_INFO = 20014 // 锦标赛排名信息
	HANDLE_MOD_CHAMPSHIP_RANK_LIST = 20015 // 锦标赛排行榜
	HANDLE_MOD_CHAMPSHIP_PRE_RANK  = 20016 // 锦标赛上期排名
	HANDLE_MOD_CHAMPSHIP_GROUP     = 20017 // 锦标赛分组
	HANDLE_MOD_DAILY_VAR_GET       = 20018 // 获取变量
	HANDLE_MOD_DAILY_VAR_SET       = 20019 // 设置变量
)

const (
	//好友操作
	HANDLE_TYPE_APPLY  = iota //申请好友
	HANDLE_TYPE_DEL           //删除好友
	HANDLE_TYPE_SYNC          //同步请求
	HADNLE_TYPE_AGREE         //同意好友
	HANDLE_TYPE_REFUSE        //拒绝申请

	//卡牌操作
	HANDLE_TYPE_REQ_CARD        //请求卡牌
	HANDLE_TYPE_AGREE_CARD      //同意卡牌
	HANDLE_TYPE_REG_CARD_REFUSE //拒绝请求卡牌
	HANDLE_TYPE_REG_CARD_FINISH //请求卡牌已结束
	HANDLE_TYPE_AGREE_CARD_FAIL //同意卡牌失败

	HANDLE_TYPE_EX_CARD            //置换卡牌
	HANDLE_TYPE_SELECT_EX_CARD     //选择置换卡牌
	HANDLE_TYPE_ARGREE_EX_CARD     //同意置换卡牌
	HANDLE_TYPE_REFUSE_SELECT_CARD //B拒绝选择置换卡牌
	HANDLE_TYPE_REFUSE_EX_CARD     //A拒绝置换卡牌

	HANDLE_TYPE_EX_CARD_SELECT_TIMEOUT //置换卡牌选择超时
	HANDLE_TYPE_EX_CARD_TIMEOUT        //置换卡牌超时

	HANDLE_TYPE_SEND_CARD //赠送卡牌

	HANDLE_TYPE_INVITE_FRIEND     //邀请好友
	HANDLE_TYPE_INVITE_ADD_FRIEND //自动添加好友
	// 榜单操作
	HANDLE_TYPE_RANK        //榜单操作
	HANDLE_TYPE_RANK_INFO   //榜单信息
	HANDLE_TYPE_RANK_NOTIFY //榜单信息
	// 邮件操作
	HANDLE_TYPE_MAIL //邮件操作

	// 锦标赛
	HANDLE_TYPE_CHAMPSHIP_GROUP   //锦标赛分组操作
	HANDLE_TYPE_CHAMPSHIP_INRANK  //锦标赛入榜操作
	HANDLE_TYPE_CHAMPSHIP_AI      //锦标赛入榜操作
	HANDLE_TYPE_CHAMPSHIP_NOTIFY  //锦标赛排名变动通知
	HANDLE_TYPE_CHAMPSHIP_ZERO    //锦标赛0点更新
	HANDLE_TYPE_CHAMPSHIP_NOTIFY2 //锦标赛0.30点通知
	// 服务器变量
	HANDLE_TYPE_VAR_GET //获取变量
	HANDLE_TYPE_VAR_SET //设置变量

	//server mod handle
	SERVER_ZERO_UPDATE        //zero update
	HANDLE_TYPE_PLAYROOM_LOSE // playroom偷取物品
	SERVER_NOON_UPDATE        // 12点更新

	FRIEND_TREASURE_HANDLE  //好友宝藏操作
	HANDLE_TYPE_MAIL_ADD    //添加邮件
	HANDLE_TYPE_MAIL_RELOAD //重新加载邮件

	HANDLE_TYPE_HANDBOOK_COLLECTION //图鉴收集
	HANDLE_TYPE_HANDBOOK_UPVOTE     //图鉴收集时间线点赞

	HANDLE_TYPE_SEND_CHARGE    //赠送充值礼包
	HANDLE_TYPE_CHARGE_RECEIVE //充值礼包领取

	HANDLE_TYPE_WISHLIST_SEND  // 发送愿望单请求
	HANDLE_TYPE_WISHLIST_AGREE // 收到愿望单请求同意

	HANDLE_TYPE_PLAYROOM_UPVOTE  // 收到playroom点赞
	HANDLE_TYPE_CHAMPSHIP_RESULT //锦标赛结果
	HANDLE_TYPE_TREASURE_RESULT  //宝藏结果

	HANDLE_TYPE_FACEBOOK_UNBIND //facebook解绑

	HANDLE_TYPE_VAR_USER_SET // 设置玩家数据
	HANDLE_TYPE_VAR_USER_GET // 获取玩家数据

	HANDLE_TYPE_PLAYROOM_KISS // playroom亲吻
	HANDLE_TYPE_PLAYROOM_GAME // playroom游戏

	HANDLE_TYPE_CATNIP_INVITE    // 猫薄荷邀请
	HANDLE_TYPE_CATNIP_AGREE     // 猫薄荷同意邀请
	HANDLE_TYPE_CATNIP_AGREE_DEL // 猫薄荷已同意邀请
	HANDLE_TYPE_CATNIP_REFUSE    // 猫薄荷拒绝邀请
	HANDLE_TYPE_CATNIP_GROWTH    // 猫薄荷成长

	HANDLE_TYPE_CATNIP_LOCK // 猫薄荷游戏锁定

	HANDLE_TYPE_VAR_EXPIRE_SET // 设置全服过期数据
	HANDLE_TYPE_VAR_EXPIRE_GET // 获取全服过期数据

	HANDLE_TYPE_FRIEND_GREETING_REPLY // 好友问候回复
	HANDLE_TYPE_FRIEND_SPONSOER       // 好友赞助体力

	HANDLE_TYPE_CHAMPSHIP_LOGIN     // 锦标赛登录
	HANDLE_TYPE_CHAMPSHIP_RANK_INFO // 锦标赛排名信息
	HANDLE_TYPE_SET_CATNIP_PARTNER  // 设置猫薄荷伙伴
	HANDLE_TYPE_CATNIP_SEND_EMOJI   // 发送猫薄荷表情
	HANDLE_TYPE_CHAMPSHIP_MY_RANK   // 锦标赛我的排名

	HANDLE_TYPE_LOGIN             // 玩家登录处理
	SERVER_PLAYER_SYNC_LOGOUT_MSG // 玩家处理完离线消息
)

const (
	// 集群
	CLUSTER_HANDSHAKE_1 = 10001 //握手1
	CLUSTER_HANDSHAKE_2 = 10002 //握手2
	CLUSTER_JOIN        = 10003 //加入
	CLUSTER_EXIT        = 10004 //退出

	CLUSTER_FRIEND_SYNC = 10005 //集群好友消息同步
)

func (m *Msg) Clone() *Msg {
	return &Msg{
		Type:   m.Type,
		To:     m.To,
		From:   m.From,
		Item:   m.Item,
		SendT:  m.SendT,
		End:    m.End,
		Extra:  m.Extra,
		Id:     m.Id,
		H:      m.H,
		UniKey: m.UniKey,
	}
}

func (m *Msg) Reply(data interface{}) *Msg {
	return &Msg{
		Type:       m.Type,
		To:         m.From,
		Item:       m.Item,
		SendT:      m.SendT,
		End:        m.End,
		Extra:      data,
		Id:         m.Id,
		H:          m.H,
		UniKey:     m.UniKey,
		HandleType: HANDLE_MOD_REPLY_PLAYER_MSG,
	}
}

func Handle(fun func(Msg) error, m Msg) error {
	return fun(m)
}
