public void DoAction(int index, Hand hand)
        {
            switch (index)
            {
            case (int)PlayerAction.EndTurn:
            {
                ui.ShowEndTurn();
                PlayTurn(SwitchPlayer().NextTurn());
                return;
            }

            case (int)PlayerAction.EndGame:
            {
                PlayerDie(players[CurrentPlayerIndex], null);
                return;
            }
            }

            if (index >= 1 && index <= hand.Size)
            {
                var adjustedIndex = index - 1;
                var card          = hand.GetCard(adjustedIndex);
                if (card.Cost > players[CurrentPlayerIndex].CurrentMana)
                {
                    ui.ShowNoMana(card.Description);
                    PlayTurn(hand);
                }
                else
                {
                    hand = players[CurrentPlayerIndex].PlayCard(adjustedIndex);
                    ui.CardPlayed(players[CurrentPlayerIndex].Name, card.Description);

                    if (!string.IsNullOrWhiteSpace(card.Message))
                    {
                        ui.ShowMessage(card.Message);
                    }
                    foreach (var action in card.Actions)
                    {
                        switch (action.Type)
                        {
                        case ActionType.Damage:
                        {
                            players[OpponentIndex].GetDamage(action.Value);
                            ui.PlayerDamaged(players[OpponentIndex].Name, action.Value);
                            break;
                        }

                        case ActionType.Heal:
                        {
                            players[CurrentPlayerIndex].Heal(action.Value);
                            ui.PlayerHealed(players[CurrentPlayerIndex].Name, action.Value);
                            break;
                        }

                        case ActionType.Draw:
                        {
                            players[CurrentPlayerIndex].Draw(action.Value);
                            ui.PlayerDrawn(players[CurrentPlayerIndex].Name, action.Value);
                            break;
                        }

                        case ActionType.ManaAdd:
                        {
                            players[CurrentPlayerIndex].AddMana(action.Value);
                            ui.GotMana(players[CurrentPlayerIndex].Name, action.Value);
                            break;
                        }
                        }
                    }
                    PlayTurn(hand);
                }
            }
            else
            {
                ui.IncorrectChoice(index);
                PlayTurn(hand);
            }
        }