using System;

namespace ET.Server
{
    /// <summary>
    /// 向场景增加玩家
    /// </summary>
    [MessageHandler(SceneType.Game)]
    public class C2G_AddUnitsToMapHandler: AMRpcHandler<C2G_AddUnitsToMap, G2C_AddUnitsToMap>
    {
        protected override async ETTask Run(Session session, C2G_AddUnitsToMap request, G2C_AddUnitsToMap 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;
            }
            // 参数判断
            if (request.UnitId <= 0 || request.Force < 0 || request.Force > (int)AreaForce.FORCEB )
            {
                Log.Debug($"参数错误...unitId={request.UnitId}, force={request.Force}");
                response.Error = ErrorCode.ERR_ParameterError;
                reply();
                return;
            }

            // Struct.MonsterUnit unit = new Struct.MonsterUnit();
            // unit.id = request.UnitId;
            // unit.force = request.Force;
            // if (!string.IsNullOrEmpty(request.Flag))
            // {
            //     unit.flag = request.Flag;
            // }
            // else
            // {
            //     unit.x = request.X;
            //     unit.y = request.Y;
            // }
            // unit.autoGuard = true;
            //
            // await player.Map.AddUnits(unit, false);

            // 预先创建数据
            Scene scene = session.DomainScene();
            long _id = IdGenerater.Instance.GenerateUnitId(scene.DomainZone());
            PlayerInfo playerInfo = new PlayerInfo();
            playerInfo.Id = _id;
            playerInfo.UserId = session.GetComponent<SessionPlayerComponent>().UserId;
            playerInfo.PlayerType = 1;
            playerInfo.Name = "玩家-" + _id;
            playerInfo.Sex = 0;
            playerInfo.Pro = (int)PlayerProType.CANG_LANG;
            playerInfo.Level = 1;
            playerInfo.Exp = 0;

            WNPlayer unitPlayer = await PlayerFactory.CreatPlayer(session, playerInfo);

            if (unitPlayer == null)
            {
                Log.Debug($"创建单位玩家有误...unitPlayerId={_id}, force={request.Force}");
                response.Error = ErrorCode.ERR_CreateUnitPlayerError;
                reply();
                return;
            }

            // 进入主播场景
            player.Map.PlayerEnterRequest(unitPlayer);

            reply();
        }
    }
}