package game

import (
	"fmt"
	mergeCluster "server/cluster"
	"server/conf"
	"server/game/mod/msg"
	GoUtil "server/game_util"
	"server/pkg/github.com/name5566/leaf/log"
)

type FriendMgr struct {
	*ServerMod
}

type FirendData struct {
	Id         int64
	List       map[int][]*msg.Msg // 本服信箱
	ClusterMsg map[int][]*msg.Msg // 集群信箱
}

func (f *FriendMgr) Init() {
	f.key = FRIEND_MGR_KEY
	f.data = &FirendData{
		List:       make(map[int][]*msg.Msg),
		ClusterMsg: make(map[int][]*msg.Msg),
	}
	// 注册处理函数
	f.init()
	if f.data.(*FirendData).List == nil {
		f.data.(*FirendData).List = make(map[int][]*msg.Msg)
	}
	if f.data.(*FirendData).ClusterMsg == nil {
		f.data.(*FirendData).ClusterMsg = make(map[int][]*msg.Msg)
	}
	f.RegisterHandler(msg.HANDLE_TYPE_APPLY, f.sendToPlayer)
	f.RegisterHandler(msg.HADNLE_TYPE_AGREE, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_DEL, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_REFUSE, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_INVITE_ADD_FRIEND, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_INVITE_FRIEND, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_FRIEND_GREETING_REPLY, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_FRIEND_SPONSOER, f.sendToPlayer)

	// 卡牌消息
	f.RegisterHandler(msg.HANDLE_TYPE_REQ_CARD, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_AGREE_CARD, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_REG_CARD_REFUSE, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_REG_CARD_FINISH, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_AGREE_CARD_FAIL, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_EX_CARD, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_SELECT_EX_CARD, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_ARGREE_EX_CARD, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_REFUSE_SELECT_CARD, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_REFUSE_EX_CARD, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_SEND_CARD, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_LOSE, f.sendToPlayer)
	f.RegisterHandler(msg.FRIEND_TREASURE_HANDLE, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_HANDBOOK_COLLECTION, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_HANDBOOK_UPVOTE, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_SEND_CHARGE, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_CHARGE_RECEIVE, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_WISHLIST_SEND, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_WISHLIST_AGREE, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_UPVOTE, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_RESULT, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_TREASURE_RESULT, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_FACEBOOK_UNBIND, f.sendToPlayer)

	f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_INVITE, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_AGREE, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_REFUSE, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_GROWTH, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_AGREE_DEL, f.sendToPlayer)
	f.RegisterHandler(msg.HANDLE_TYPE_CATNIP_SEND_EMOJI, f.sendToPlayer)

	f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_KISS, f.sendToPlayerOnline)
	f.RegisterHandler(msg.HANDLE_TYPE_PLAYROOM_GAME, f.sendToPlayer)

	f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_LOGIN, f.SendMsgToCenter)
	f.RegisterHandler(msg.HANDLE_TYPE_CHAMPSHIP_INRANK, f.SendMsgToCenter)
}

func (f *FriendMgr) getData() *FirendData {
	return f.data.(*FirendData)
}

func (f *FriendMgr) ZeroUpdate(m *msg.Msg) (interface{}, error) {
	Now := GoUtil.Now()
	for k, v := range f.getData().List {
		for j, msg := range v {
			if msg.End < Now-sevendays {
				f.getData().List[k] = append(f.getData().List[k][:j], f.getData().List[k][j+1:]...)
			}
		}
	}
	return nil, nil
}

// 通知玩家
func (f *FriendMgr) sendToPlayer(m *msg.Msg) (interface{}, error) {
	f.getData().Id++
	m.Id = f.getData().Id
	err := sendToPlayer(m)
	if err == nil {
		m.H = 1
	}
	ToServerId := GoUtil.GetServerIdByUid(m.To)
	if ToServerId != conf.Server.ServerID {
		f.getData().ClusterMsg[m.To] = append(f.getData().ClusterMsg[m.To], m) // 保存到集群消息
	} else {
		f.getData().List[m.To] = append(f.getData().List[m.To], m) // 保存到本地消息
	}
	log.Debug("send to player %d success, msg :%v", m.To, m)
	return nil, nil
}

// 通知玩家
func (f *FriendMgr) sendToPlayerOnline(m *msg.Msg) (interface{}, error) {
	f.getData().Id++
	m.Id = f.getData().Id
	sendToPlayerOnline(m)
	return nil, nil
}

// 发送消息给玩家
func sendToPlayer(m *msg.Msg) error {
	p := G_GameLogicPtr.GetPlayer(int64(m.To))
	if p == nil || p.stop {
		return fmt.Errorf("player %d not online", m.To)
	}
	p.Send(m.Clone())
	return nil
}

func sendToPlayerOnline(m *msg.Msg) error {
	p := G_GameLogicPtr.GetPlayer(int64(m.To))
	if p == nil || p.stop {
		return fmt.Errorf("player %d not online", m.To)
	}
	p.Send(m.Clone())
	return nil
}

// 集群好友消息同步
func ClusterFriendSync(m *msg.Msg) error {
	if v, ok := G_GameLogicPtr.FriendMgr.getData().ClusterMsg[m.To]; ok {
		for _, msg := range v {
			if msg.H == 1 {
				continue
			}
			err := mergeCluster.SendServerMsg(msg.Clone(), m.To)
			if err == nil {
				msg.H = 1
			}
		}
	}
	return nil
}

// 异步发送消息给中心服
func (f *FriendMgr) SendMsgToCenter(m *msg.Msg) (interface{}, error) {
	return nil, mergeCluster.SendServerMsg(m, conf.Server.CenterNode)
}

func (f *FriendMgr) CallMsgToCenter(m *msg.Msg) (interface{}, error) {
	return mergeCluster.CallServerMsg(m, conf.Server.CenterNode)
}
