using System;
using System.Net;
using System.Net.Sockets;

namespace ET.Client
{
    public static class LoginHelper
    {
        public static async ETTask<int> Login(string ip, int port, string roomToken)
        {
            Scene clientScene = ClientSceneManagerComponent.Instance.Get( 1 );
            if( clientScene == null )
            {
                Log.Error( "Not found client scene" );
                return ErrorCode.ERR_SystemError;
            }

            try
            {
                // 创建一个ETModel层的Session
                clientScene.RemoveComponent<RouterAddressComponent>();
                clientScene.RemoveComponent<NetClientComponent>();
                clientScene.RemoveComponent<SessionComponent>();

                // 获取路由跟realmDispatcher地址
                var routerAddressComponent = clientScene.AddComponent<RouterAddressComponent, string, int>(ip, port);
                await routerAddressComponent.Init();

                clientScene.AddComponent<NetClientComponent, AddressFamily, NetworkProtocol>(
                    routerAddressComponent.RouterManagerIPAddress.AddressFamily,
                    NetworkProtocol.KCP
                );
                //如果有多个软路由地址,则通过roomid弄点花样模拟随机获取一个地址
                IPEndPoint realmAddress = routerAddressComponent.GetRealmAddress(roomToken ?? "1");

                // 登陆验证
                R2C_Login r2CLogin;
                using (Session session = clientScene.GetComponent<NetClientComponent>().Create(realmAddress))
                // using (Session session = await RouterHelper.CreateRouterSession(clientScene, realmAddress))
                {
                    r2CLogin = (R2C_Login)await session.Call(new C2R_Login() );
                }
                if (r2CLogin.Error != ErrorCode.ERR_Success)
                {
                    Log.Error($"登陆验证错误...errCode={r2CLogin.Error}");
                    return r2CLogin.Error;
                }

                // 创建一个gate Session,并且保存到SessionComponent中
                Session gateSession = clientScene.GetComponent<NetClientComponent>().Create(NetworkHelper.ToIPEndPoint(r2CLogin.Address[0]));
                // Session gateSession = await RouterHelper.CreateRouterSession(clientScene, NetworkHelper.ToIPEndPoint(r2CLogin.Address[0]));

                // 登陆gate
                G2C_LoginGame g2CLoginGate = (G2C_LoginGame)await gateSession.Call(new C2G_LoginGame() { Token = roomToken ?? "" });
                if (g2CLoginGate.Error != ErrorCode.ERR_Success)
                {
                    Log.Error($"登陆game错误...errCode={g2CLoginGate.Error}");
                    return g2CLoginGate.Error;
                }

                // 保存账号信息
                gateSession.AddComponent<PingComponent>();
                clientScene.AddComponent<SessionComponent>().Session = gateSession;
                var player = clientScene.GetComponent<PlayerComponent>();

                player.PlayerId = g2CLoginGate.Player.id;
                var ret = (G2C_BindPlayer)await gateSession.Call(new C2G_BindPlayer() { PlayerId = player.PlayerId });

                EnterMapHelper.EnterMapAsync(clientScene, ret.Player, ret.Player.instanceId).Coroutine();
            }
            catch (Exception e)
            {
                Log.Error($"登陆出错...{e.Message}");
                return ErrorCode.ERR_LoginError;
            }

            return ErrorCode.ERR_Success;
        }
    }
}