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

namespace ET.Client
{
    public static class LoginHelper
    {
        public static async ETTask Login(Scene clientScene, string account, string password)
        {
            try
            {
                // 创建一个ETModel层的Session
                clientScene.RemoveComponent<RouterAddressComponent>();
                clientScene.RemoveComponent<NetClientComponent>();
                clientScene.RemoveComponent<SessionComponent>();
                
                // 获取路由跟realmDispatcher地址
                RouterAddressComponent routerAddressComponent = clientScene.AddComponent<RouterAddressComponent, string, int>(ConstValue.RouterHttpHost, ConstValue.RouterHttpPort);
                await routerAddressComponent.Init();
                
                clientScene.AddComponent<NetClientComponent, AddressFamily>(routerAddressComponent.RouterManagerIPAddress.AddressFamily);
                
                IPEndPoint realmAddress = routerAddressComponent.GetRealmAddress(account);
                
                // 登录验证
                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() { Account = account, Password = password });
                }
                if (r2CLogin.Error != ErrorCode.ERR_Success)
                {
                    Log.Error($"登陆验证错误...errCode={r2CLogin.Error}");
                    return;
                }

                // 创建一个game Session,并且保存到SessionComponent中
                Session gameSession = clientScene.GetComponent<NetClientComponent>().Create(NetworkHelper.ToIPEndPoint(r2CLogin.Address));
                // Session gameSession = await RouterHelper.CreateRouterSession(clientScene, NetworkHelper.ToIPEndPoint(r2CLogin.Address));
				
                // 登录game
                G2C_LoginGame g2CLoginGame = (G2C_LoginGame)await gameSession.Call(
                    new C2G_LoginGame() { Key = r2CLogin.Key, GameId = r2CLogin.GameId});
                if (g2CLoginGame.Error != ErrorCode.ERR_Success)
                {
                    Log.Error($"登陆game错误...errCode={g2CLoginGame.Error}");
                    return;
                }
                if (ConstValue.SessionTimeoutTime > 0 && gameSession.GetComponent<SessionIdleCheckerComponent>() == null)
                {
                    gameSession.AddComponent<SessionIdleCheckerComponent>();
                }
                
                // 保存账号信息
                clientScene.AddComponent<SessionComponent>().Session = gameSession;
                
                clientScene.GetComponent<RoleInfoComponment>().ClearRoleInfo();
                clientScene.GetComponent<RoleInfoComponment>().SetRoleInfo(g2CLoginGame);
                Log.Debug("登陆game成功!");

                await EventSystem.Instance.PublishAsync(clientScene, new EventType.LoginFinish());
            }
            catch (Exception e)
            {
                Log.Error($"登陆出错...{e.Message}");
            }
        } 
    }
}