using System;

namespace ET.Server
{
    /// <summary>
    /// 加载100%
    /// </summary>
    [MessageHandler(SceneType.Game)]
    public class C2G_EnterMapHandler: AMRpcHandler<C2G_EnterMap, G2C_EnterMap>
    {
        protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response, Action reply)
        {
            if (session.DomainScene().SceneType != SceneType.Game)
            {
                Log.Debug($"Game 请求的Scene错误...SceneType={session.DomainScene().SceneType}");
                session.Dispose();
                return;
            }

            // 移除session自动超时组件
            session.RemoveComponent<SessionAcceptTimeoutComponent>();

            WNPlayer player = session.GetComponent<SessionPlayerComponent>().GetMyPlayer();
            if (player == null)
            {
                Log.Debug($"操作错误, player is null");
                response.Error = ErrorCode.ERR_OperationError;
                reply();
                return;
            }

            Log.Info($"玩家请求进入场景: playerId={player.GetId()}, instanceId={request.InstanceId}");

            Map map = player.Map;

            // 当客户端所要进入的场景不为空且不等于当前场景,忽略掉本次请求
            if (request.InstanceId > 0 && map.Id != request.InstanceId)
            {
                Log.Debug(
                    $"连续切图吗? playerId={player.GetId()}, name={player.GetName()}, mapId={map.MapId}, map.InstanceId={map.Id}, request.InstanceId={request.InstanceId}");
                response.Error = ErrorCode.ERR_OperationToFast;
                reply();
                return;
            }

            if (map == null)
            {
                Log.Debug($"进入场景出错, 场景不存在...playerId={player.GetId()}, instanceId={request.InstanceId}");
                response.Error = ErrorCode.ERR_EnterMapError;
                reply();
                return;
            }

            map.PlayerEnterRequest(player);
            map.OnPlayerEntered(player);
            player.OnEndEnterScene();

            response.MapInstanceId = player.Map.Id;
            reply();

            await ETTask.CompletedTask;
        }
    }
}