using linker.tunnel.wanport;
using linker.tunnel.transport;
using System.Net;
using System.Security.Cryptography.X509Certificates;
namespace linker.tunnel.adapter
{
    public interface ITunnelAdapter
    {
        /// 
        /// 本机局域网IP
        /// 
        public IPAddress LocalIP { get; }
        /// 
        /// ssl加密证书
        /// 
        public X509Certificate2 Certificate { get; }
        /// 
        /// 获取外网端口协议列表
        /// 
        /// 
        public List GetTunnelWanPortCompacts();
        /// 
        /// 保存外网端口协议列表
        /// 
        /// 
        public void SetTunnelWanPortCompacts(List compacts);
        /// 
        /// 获取打洞协议列表
        /// 
        /// 
        public List GetTunnelTransports();
        /// 
        /// 保存打洞协议列表
        /// 
        /// 
        public void SetTunnelTransports(List transports);
        /// 
        /// 获取本地网络信息
        /// 
        /// 
        public NetworkInfo GetLocalConfig();
        /// 
        /// 获取远端的外网信息,比如你是A,你要获取B的信息,可以在B调用  TunnelTransfer.GetWanPort() 发送回来
        /// 
        /// 
        /// 
        public Task GetRemoteWanPort(string remoteMachineId);
        /// 
        /// 发送开始打洞
        /// 
        /// 
        /// 
        public Task SendConnectBegin(TunnelTransportInfo tunnelTransportInfo);
        /// 
        /// 发送打洞失败
        /// 
        /// 
        /// 
        public Task SendConnectFail(TunnelTransportInfo tunnelTransportInfo);
        /// 
        /// 发送打洞成功
        /// 
        /// 
        /// 
        public Task SendConnectSuccess(TunnelTransportInfo tunnelTransportInfo);
    }
    public sealed class NetworkInfo
    {
        /// 
        /// 本机局域网IP列表
        /// 
        public IPAddress[] LocalIps { get; set; }
        /// 
        /// 本机与外网的距离,通过多少网关
        /// 
        public int RouteLevel { get; set; }
        /// 
        /// 本机名
        /// 
        public string MachineId { get; set; }
    }
}