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

namespace ET.Client
{
    public static class LoginHelper
    {
        public static async ETTask<int> Login(Scene clientScene, string account, string password)
        {
            try
            {
                // 创建一个ETModel层的Session
                clientScene.RemoveComponent<RouterAddressComponent>();
                clientScene.RemoveComponent<NetClientComponent>();
                clientScene.RemoveComponent<SessionComponent>();
                clientScene.RemoveComponent<AccountInfoComponent>();
                

                // 获取路由跟realmDispatcher地址
                RouterAddressComponent routerAddressComponent = clientScene.GetComponent<RouterAddressComponent>();
                if (routerAddressComponent == null)
                {
                    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 = await RouterHelper.CreateRouterSession(clientScene, realmAddress))
                {
                    r2CLogin = (R2C_Login)await session.Call(new C2R_Login() { Account = account, Password = MD5Helper.StringMD5(password) });
                }

                if (r2CLogin.Error != ErrorCode.ERR_Success)
                {
                    Log.Debug($"登陆验证错误...errCode={r2CLogin.Error}");
                    return r2CLogin.Error;
                }

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

                // 登陆gate
                G2C_LoginGame g2CLoginGate = (G2C_LoginGame)await gateSession.Call(new C2G_LoginGame() { Token = r2CLogin.Token, UserId = r2CLogin.UserId });

                if (g2CLoginGate.Error != ErrorCode.ERR_Success)
                {
                    Log.Debug($"登陆game错误...errCode={g2CLoginGate.Error}");
                    return g2CLoginGate.Error;
                }

                // 保存账号信息
                clientScene.AddComponent<SessionComponent>().Session = gateSession;
                var accountComponet = clientScene.AddComponent<AccountInfoComponent>();
                accountComponet.Token = r2CLogin.Token;
                accountComponet.UserId = r2CLogin.UserId;
                Log.Debug($"登陆game成功...token={r2CLogin.Token}, userId={r2CLogin.UserId}");

                //var player = g2CLoginGate.Players[0];
                //TODO:选角进入
                //使用简化流程直接进入游戏
                var ret = (G2C_BindPlayer)await gateSession.Call(new C2G_BindPlayer() { PlayerId = 0 });

                await EventSystem.Instance.PublishAsync(clientScene, new EventType.LoginFinish() { player = ret.Player});
            }
            catch (Exception e)
            {
                Log.Error($"登陆出错...{e.Message}");
                return ErrorCode.ERR_LoginError;
            }

            return ErrorCode.ERR_Success;
        }
    }
}