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

namespace ET.Server
{
    /// <summary>
    /// 出牌
    /// </summary>
    [MessageHandler(SceneType.Game)]
    public class C2G_DisCardHandler : AMRpcHandler<C2G_DisCard, G2C_DisCard>
    {
        protected override async ETTask Run(Session session, C2G_DisCard request, G2C_DisCard response, Action reply)
        {
            Player player = session.GetComponent<SessionPlayerComponent>().GetMyPlayer();
            if (player == null)
            {
                response.Error = ErrorCode.ERR_OperationError;
                response.Message = "玩家不存在或离线...";
                reply();
                return;
            }
            
            // 玩家是否进入房间
            if (player.RoomId <= 0)
            { 
                response.Error = ErrorCode.ERR_OperationError;
                response.Message = "玩家不在房间,不可操作...";
                reply();
                return;
            }

            Scene scene = session.DomainScene();
            
            // 房间是否能找到
            Room room = scene.GetComponent<GameRoomComponent>().Get(player.RoomId);
            if (room == null)
            {
                response.Error = ErrorCode.ERR_OperationError;
                response.Message = "请求的房间不存在或已解散...";
                reply();
                return;
            }
            
            // todo 玩家房间是否已开始, 后面这个判断要调整
            // 房间状态
            HGHuangHuangComponent hgHuangHuangComponent = room.GetComponent<HGHuangHuangComponent>();
            if (hgHuangHuangComponent != null && hgHuangHuangComponent.State != 2)
            {
                response.Error = ErrorCode.ERR_OperationError;
                response.Message = "房间不在游戏中,不可出牌...";
                reply();
                return;
            }
            
            // 玩家状态
            if (player.State != 2)
            {
                response.Error = ErrorCode.ERR_OperationError;
                response.Message = "玩家不在游戏中,不可出牌...";
                reply();
                return;
            }
            
            if (request.Card <= 0 || !HGHuangHuangConst.Values.Contains(request.Card))
            {
                response.Error = ErrorCode.ERR_OperationError;
                response.Message = "出牌错误...";
                reply();
                return;
            }
            
            // 判断玩家是否可出牌
            if (hgHuangHuangComponent.CurrentPlayer.Id != player.Id)
            {
                response.Error = ErrorCode.ERR_OperationError;
                response.Message = "不是当前操作玩家,出牌错误...";
                reply();
                return;
            }
            
            // 出牌
            hgHuangHuangComponent.DisCard(room, player, request.Card, false);
            
            // 返回
            reply();
            await ETTask.CompletedTask;
        }
    }
}