using System.Collections.Generic;

namespace IGP.UnitySDK.Network
{
    public interface IIGPNetwork
    {
        // Session Management
        IGPNetworkResult AcceptSessionRequest(IGPPlayerID local_peer, IGPPlayerID remote_peer);
        IGPNetworkResult CloseSession(IGPPlayerID local_peer, IGPPlayerID remote_peer);
        IGPNetworkResult GetSessionState(IGPPlayerID remote_peer, out IGPNetworkSessionState session_state);

        // Standard Data
        // 统一按可靠 KCP 发送；适合无需自动分片的常规消息。
        IGPNetworkResult SendData(IGPPlayerID local_peer, IGPPlayerID remote_peer, byte[] data_buf, uint data_len, uint message_type = 0);
        // 兼容入口。与 SendData 一样按可靠 KCP 发送，但允许 SDK 对较大 payload 自动分片。
        IGPNetworkResult SendReliableData(IGPPlayerID local_peer, IGPPlayerID remote_peer, byte[] data_buf, uint data_len, uint message_type = 0);
        bool IsDataReady(out IGPPlayerID local_peer, out uint data_len, out uint message_type);
        IGPNetworkResult ReadData(IGPPlayerID local_peer, out IGPPlayerID remote_peer, byte[] data_buf, uint data_len, uint message_type = 0);

        // Raw Data (Cross-Game)
        // reliable 参数仅为兼容保留，当前始终按可靠 KCP 处理。
        IGPNetworkResult SendRawData(IGPPlayerID local_peer, IGPGamePeer remote_game_peer, byte[] data_buf, uint data_len, bool reliable, uint message_type = 0);
        IGPNetworkResult AcceptRawSessionRequest(IGPPlayerID local_peer, IGPGamePeer remote_game_peer);
        IGPNetworkResult ReadRawData(IGPPlayerID local_peer, out IGPGamePeer remote_game_peer, byte[] data_buf, uint data_len, uint message_type = 0);

        // Utilities
        IGPNetworkResult ResolveHostname(string domain, out List<string> ip_list);
        IGPNetworkResult BlockMessageType(IGPPlayerID local_peer, uint message_type);
        IGPNetworkResult UnblockMessageType(IGPPlayerID local_peer, uint message_type);

        /// <summary>
        /// 获取与特定玩家的估算端到端延迟（毫秒）
        /// </summary>
        uint GetPeerLatency(IGPPlayerID remote_peer);
    }
}
