using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace ET.Server
{
    /// <summary>
    /// 登入游戏服.获取角色列表
    /// </summary>
    [MessageHandler(SceneType.Game)]
    public class C2G_LoginGameHandler : AMRpcHandler<C2G_LoginGame, G2C_LoginGame>
    {
        protected override async ETTask Run(Session session, C2G_LoginGame request, G2C_LoginGame response, Action reply)
        {
            if (session.DomainScene().SceneType != SceneType.Game)
            {
                Log.Debug($"Game 请求的Scene错误...SceneType={session.DomainScene().SceneType}");
                session.Dispose();
                return;
            }

            // 判断参数
            if (string.IsNullOrEmpty(request.Token.Trim()) || request.UserId <= 0)
            {
                Log.Debug($"Game token 登陆超时");
                response.Error = ErrorCore.ERR_ConnectGateKeyError;
                response.Message = "Game token 登陆超时";
                reply();
                session.Disconnect().Coroutine();
                return;
            }

            // 移除session自动超时组件
            session.RemoveComponent<SessionAcceptTimeoutComponent>();
            // 添加session组件,用于绑定角色
            session.AddComponent<HeartBeatComponent, Session>(session);
            session.AddComponent<SessionPlayerComponent>().UserId = request.UserId;
            session.AddComponent<MailBoxComponent, MailboxType>(MailboxType.GateSession);

            response.Players = new List<PlayerBasic>();

            // 获取角色列表
            List<PlayerInfo> list = await DBManagerComponent.Instance.GetZoneDB(session.DomainZone())
                    .Query<PlayerInfo>(p => p.UserId == request.UserId);

            if (list is { Count: > 0 })
            {
                foreach (PlayerInfo info in list.Where(playerInfo => playerInfo != null))
                {
                    session.GetComponent<SessionPlayerComponent>().Add(info);

                    response.Players.Add(PlayerHelper.PlayerInfoToPlayerBasicProto(info));
                }
            }

            reply();
        }
    }
}