package servers

// import (
// 	"errors"
// 	"fmt"
// 	"leafstalk/covenant/msg"
// 	"leafstalk/module"
// 	"leafstalk/network/cluster"
// 	"leafstalk/otherutils/snowflake"
// 	"leafstalk/otherutils/timercache"
// 	"os"
// 	"time"
// )

// func test() {

// 	var req string
// 	s := GetWorldServer()
// 	RemoteCall(req, func() {

// 	}, func() {

// 	}, func() {

// 	}, s, c)
// }

// var (
// 	NodeNum int64
// )

// type RemoteCallService struct {
// 	Skeleton *module.Skeleton
// 	// Processor  *json.Processor
// 	timerCache *timercache.CacheKeys
// 	// getAgent   func() *cluster.ServerAgent
// 	node          int64
// 	MsgIdSequence *snowflake.Node
// }

// // 1、每个模块有一个单独的节点
// //

// // 1、router中，解析消息ID，发往对应模块

// func NewRemoteCallAndInit(m *module.Skeleton) (*RemoteCallService, error) {

// 	rcs := new(RemoteCallService)
// 	rcs.timerCache = timercache.NewCacheKeys(time.Second * 10)

// 	NodeNum += 1
// 	rcs.node = NodeNum
// 	var err error
// 	rcs.MsgIdSequence, err = snowflake.NewSecondNode(rcs.node, 10)
// 	if err != nil {
// 		return nil, err
// 	}

// 	rcs.Skeleton = m

// 	// s.Processor = Processor
// 	// s.getAgent = getAgent

// 	rcs.Skeleton.RegisterChanRPC("RpcTimeout", handleRpcTimeout)
// 	return rcs, nil
// }

// // 主协程处理超时消息
// func handleRpcTimeout(args []interface{}) {
// 	f, ok := args[0].(func(resp interface{}, err error))
// 	if !ok {
// 		fmt.Fprintf(os.Stderr, "handleRpcTimeout func type error. %#v", args[0])
// 		return
// 	}

// 	f(nil, ErrTimeOut)
// }

// func (rcs *RemoteCallService) SendMsgTo(msg msg.RPCer, fSucess func(resp interface{}, err error), toServerAgent *cluster.ServerAgent, playerId int64, gateId int) error {

// 	if toServerAgent == nil {
// 		return ErrNoConnected
// 	}

// 	//定时缓存
// 	k := rcs.timerCache.Add(fSucess, func(e *timercache.TimerEntry) {
// 		//另一个协程，发送超时消息给处理协程
// 		rcs.Skeleton.HandlerServer.Go("RpcTimeout", fSucess)
// 	})
// 	msg.SetMsgId(k)

// 	//发送
// 	err := toServerAgent.WriteServerRouteMsg(msg, playerId, gateId)
// 	if err != nil {
// 		rcs.timerCache.Remove(k)
// 		return err
// 	}

// 	return nil
// }

// type RemoteCallSendParam struct {
// 	toServerAgent *cluster.ServerAgent
// 	playerId      int64
// 	gateId        int
// }

// type SendOpt interface {
// 	configureSendParam(opts *RemoteCallSendParam) error
// }

// type SendOptFn func(opts *RemoteCallSendParam) error

// func (opt SendOptFn) configureSendParam(opts *RemoteCallSendParam) error {
// 	return opt(opts)
// }

// func ReceiveServer(agent *cluster.ServerAgent) SendOpt {
// 	return SendOptFn(func(opts *RemoteCallSendParam) error {
// 		opts.toServerAgent = agent
// 		return nil
// 	})
// }

// func AboutPlayer(playerId int64, gateId int) SendOpt {
// 	return SendOptFn(func(opts *RemoteCallSendParam) error {
// 		opts.playerId = playerId
// 		opts.gateId = gateId
// 		return nil
// 	})
// }

// func AboutPlayerAgent(playerAgent *servers.PlayerAgent) SendOpt {
// 	return SendOptFn(func(opts *RemoteCallSendParam) error {
// 		if playerAgent == nil {
// 			return errors.New("playerAgent is nil")
// 		}

// 		opts.playerId = playerAgent.PlayerId
// 		opts.gateId = playerAgent.GateId
// 		return nil
// 	})
// }

// // func RemoteCall()
// func RemoteCall[T msg.RpcResponse](request msg.RPCer, sucess func(respMsg T),
// 	fail func(errCode int, err error), noexpect func(exceptCode int),
// 	rpcService *RemoteCallService, peerServer *server, opts ...SendOpt) {

// 	processResponse := func(respa interface{}, err error) {
// 		if err != nil {
// 			noexpect(22) //超时
// 			return
// 		}
// 		resp3, ok := respa.(T)
// 		if !ok {
// 			noexpect(23) //数据类型错误
// 			return
// 		}

// 		// 添加失败打印错误，并不恢复
// 		errCode := resp3.GetErrCode()
// 		if errCode != 0 {
// 			fail(errCode, fmt.Errorf("%v", errCode))
// 			return
// 		}

// 		// 奖品发送给客户端
// 		sucess(resp3)
// 	}

// 	config := RemoteCallSendParam{}
// 	for _, opt := range opts {
// 		if opt == nil {
// 			continue
// 		}
// 		if err := opt.configureSendParam(&config); err != nil {
// 			fail(25, err)
// 			return
// 		}
// 	}
// 	if transService == nil {
// 		fail(26, fmt.Errorf("%v", 26))
// 		return
// 	}

// 	//定时缓存
// 	k := rpcService.timerCache.Add(fSucess, func(e *timercache.TimerEntry) {
// 		//另一个协程，发送超时消息给处理协程
// 		rpcService.Skeleton.HandlerServer.Go("RpcTimeout", fSucess)
// 	})
// 	msg.SetMsgId(k)

// 	//发送
// 	toServerAgent := config.toServerAgent
// 	err := toServerAgent.WriteServerRouteMsg(msg, playerId, gateId)
// 	if err != nil {
// 		s.timerCache.Remove(k)
// 		return err
// 	}

// 	// if toServerAgent == nil {
// 	// 	toServerAgent = transService.getAgent()
// 	// }
// 	// err := transService.SendMsgTo2(request, processResponse, toServerAgent, config.playerId, config.gateId)
// 	// if err != nil {
// 	// 	fail(21, err)
// 	// }
// }
