using Dof;
using dotNetty_kcp;
using DotNetty.Buffers;
using UnityEngine;
using System.IO;
using base_kcp;
using Guru;
namespace DofLibrary
{
    /// 
    /// 游戏消息发送接口实现类
    /// 
    internal class MessageSender : IMessageSender
    {
        private long _cid;
        private Ukcp _client;
        private MemoryStream _localSendMs = new MemoryStream(1024 * 1024 * 1);
        /// 
        /// 设置 kcp 客户端,用于发送消息
        /// 
        public Ukcp Client
        {
            set => _client = value;
        }
        /// 
        /// 当收到服务端发来的 PlayerEntered 事件时,设置房间中的玩家编号 
        /// 
        public long Cid
        {
            set => _cid = value;
        }
        public void PlayerEnter(string roomId, string uid, string nickName, string country, string appId, string token)
        {
            var playerEnter = new ClientMessage
            {
                PlayerEnter = new PlayerEnter
                {
                    RoomId = roomId,
                    Uid = uid,
                    NickName = nickName,
                    Country = country,
                    AppId = appId,
                    Token = token
                }
            };
            Send(playerEnter);
            //Debug.Log("PlayerEnter message sent");
        }
        public void LevelPrepared(string levelId)
        {
            var message = new ClientMessage
            {
                LevelPrepared = new LevelPrepared
                {
                    Cid = _cid,
                    Level = levelId
                }
            };
            Send(message);
            //Debug.Log("LevelPrepared message sent");
        }
        public void PointFound(string levelId, int pointId, float combo)
        {
            var message = new ClientMessage
            {
                PointFound = new PointFound
                {
                    Cid = _cid,
                    Level = levelId,
                    PointId = pointId,
                    Combo = combo
                }
            };
            Send(message);
            //Debug.Log("PointFound message sent");
        }
        public void LevelEnd(string levelId)
        {
            var message = new ClientMessage
            {
                LevelEnd = new LevelEnd
                {
                    Cid = _cid,
                    Level = levelId
                }
            };
            Send(message);
            //Debug.Log("LevelEnd message sent");
        }
        public void AllLevelEnd(float timeSpent)
        {
            var message = new ClientMessage
            {
                AllLevelEnd = new AllLevelEnd
                {
                    Cid = _cid,
                    TimeSpent = timeSpent
                }
            };
            Send(message);
            //Debug.Log("AllLevelEnd message sent");
        }
        public void PlayerLeave()
        {
            var message = new ClientMessage
            {
                PlayerLeave = new PlayerLeave
                {
                    Cid = _cid
                }
            };
            Send(message);
            //Debug.Log("PlayerLeave message sent");
        }
        public void Heartbeat(long timestamp)
        {
            var message = new ClientMessage
            {
                Heartbeat = new Heartbeat
                {
                    Timestamp = timestamp
                }
            };
            Send(message);
            //Debug.Log("Heartbeat message sent");
        }
        private void Send(ClientMessage message)
        {
            _localSendMs.SetLength(0);
            _localSendMs.Position = 0;
            ProtobufHelper.ToStream(message, _localSendMs);
            var dataBuf = Unpooled.DirectBuffer(1024 * 1024 * 1);
            dataBuf.WriteBytes(_localSendMs.GetBuffer(), 0, (int)_localSendMs.Length);
            _client.write(dataBuf);
            dataBuf.Release();
        }
    }
}