package main

import (
	"fmt"
	"github.com/golang/protobuf/proto"
	"leaf/log"
	"net"
	"server/src/msg"
)

var listener = map[uint16]func(data []byte){}

func init() {
	addEventListener(msg.HEART, msg.SC_RESPONSE, onHeartbeat) // 心跳
	addEventListener(msg.USER, msg.SC_LOGIN, onUserLogin)     // 登录
}

func addEventListener(mainCmd, subCmd uint8, callback func(data []byte)) {
	listener[encodeMsgID(mainCmd, subCmd)] = callback
}

func dispatchMsg(data []byte) {
	// 反序列化
	id, err := Unmarshal(data)
	if err != nil {
		log.Debug("unmarshal message error: %v", err)
	}

	// check len
	if id < 0 {
		log.Debug("id is invalid")
	} else if id > 65535 {
		log.Debug("id is to long")
	}

	fn := listener[id]
	if fn != nil {
		fn(data[2:]) //前2个字节为消息长度
	} else {
		log.Debug("id is not register")
	}
}

func SendHeartbeat(conn net.Conn) {
	log.Debug("send SendHeartbeat message")
	WriteMsgByMsgID(conn, msg.HEART, msg.CS_REQUEST, &msg.CS_Heartbeat{})
}

func onHeartbeat(data []byte) {
	log.Debug("recv onHeartbeat message")
}

// c->s login request
func UserLogin(conn net.Conn) {
	log.Debug("send UserLogin message")
	WriteMsgByMsgID(conn, msg.USER, msg.CS_LOGIN, &msg.CS_User_Login{
		Udid:          "test",
		Passwd:        "123",
		Platform:      0,
		ClientVersion: "0",
		DeviceName:    "1",
	})
}

// s->c login result
func onUserLogin(data []byte) {
	var msg msg.SC_User_Login

	// 使用 proto.Unmarshal 将二进制数据解码到消息对象
	err := proto.Unmarshal(data, &msg)
	if err != nil {
		log.Debug("Failed to unmarshal data: %v", err)
	}

	// 打印解码后的消息内容
	fmt.Println("Decoded message:", msg)

	// 输出收到的消息的内容
	log.Debug("recv SC_User_Login udid = %s", msg.GetUdid())

}
