package router

import (
	"errors"
	"leafstalk/module"
	"leafstalk/router/json"
	"reflect"
)

type MsgRegister struct {
	skeleton  *module.Skeleton
	processor *json.Processor
}

func NewRegister(skeleton *module.Skeleton, processor *json.Processor) *MsgRegister {
	mg := new(MsgRegister)
	mg.skeleton = skeleton
	mg.processor = processor
	return mg
}

//handleMsg 消息结构体注册处理函数,并路由到这里
func (m *MsgRegister) HandleMsg(msg interface{}, h interface{}) *MsgRegister {
	//设置处理函数
	m.skeleton.RegisterChanRPC(reflect.TypeOf(msg), h)

	//消息路由目标是本模块
	m.processor.Register(msg)
	m.processor.SetRouter(msg, m.skeleton.HandlerServer)
	return m
}

//HandleMsgNoRouter 消息结构体注册处理函数，不路由到这里
func (m *MsgRegister) HandleMsgNoRouter(msg interface{}, h interface{}) {
	//设置处理函数
	m.skeleton.RegisterChanRPC(reflect.TypeOf(msg), h)
}

//RegisterMsg 仅注册消息
func (m *MsgRegister) RegisterMsg(msg interface{}) {
	m.processor.Register(msg)
}

//HandleRpcMsg 进程内模块间消息注册
func (m *MsgRegister) HandleRpcMsg(msg interface{}, h interface{}) error {
	msgType := reflect.TypeOf(msg)
	if msgType == nil || msgType.Kind() != reflect.Ptr {
		return errors.New("json message pointer required")
	}
	msgID := msgType.Elem().Name()
	m.skeleton.RegisterChanRPC(msgID, h)
	return nil
}
