using System;
using System.Collections.Generic;

namespace ET.Server
{
    /// <summary>
    /// 选角绑定角色
    /// </summary>
    [MessageHandler(SceneType.Game)]
    public class C2G_BindPlayerHandler: AMRpcHandler<C2G_BindPlayer, G2C_BindPlayer>
    {
        protected override async ETTask Run(Session session, C2G_BindPlayer request, G2C_BindPlayer response, Action reply)
        {
            // 判断参数
            if (string.IsNullOrEmpty(request.PlayerId.ToString().Trim()))
            {
                Log.Debug($"参数错误,角色id为空");
                response.Error = ErrorCode.ERR_ParameterError;
                reply();
                return;
            }

            PlayerInfo info = session.GetComponent<SessionPlayerComponent>().PlayerInfo;
            if (info != null && request.PlayerId != info.Id)
            {
                Log.Debug($"参数错误,角色id错误");
                response.Error = ErrorCode.ERR_ParameterError;
                reply();
                return;
            }

            Scene scene = session.DomainScene();

            WNPlayer player = scene.GetComponent<GamePlayerComponent>().Get(request.PlayerId);

            if (player != null)
            {
                // 重新登录,赋值session
                if (player.Session.InstanceId != session.InstanceId)
                {
                    player.Session = session;
                    Log.Debug($"重新登录,赋值session...");
                }
            }
            else
            {
                player = scene.GetComponent<GamePlayerComponent>().AddChild<WNPlayer, Session>(session);
            }

            // 绑定选择的玩家
            session.GetComponent<SessionPlayerComponent>().BindPlayerId(request.PlayerId > 0 ? request.PlayerId : player.GetId());

            // todo 分配场景
            Map map = MapHelper.BindPlayerDispatch(player);
            MapConfig mapConfig = map.Prop;

            // 登录数据
            player.OnLogin();
            map.PlayerLogin(player);

            response.Player = PlayerHelper.PlayerInfoToProto(player);
            response.Player.areaId = mapConfig.TemplateID;
            response.Player.instanceId = map.Id;
            response.Player.mapId = map.MapId;

            reply();
            await ETTask.CompletedTask;
        }
    }
}