static public boolean playCounterSpell(ArrayList<SpellAbility> possibleCounters) {
        SpellAbility bestSA = null;
        int bestRestriction = Integer.MIN_VALUE;

        for (SpellAbility sa : possibleCounters) {
            sa.setActivatingPlayer(AllZone.getComputerPlayer());
            if (canBePlayedAndPayedByAI(sa)) { //checks everything nescessary
                if (bestSA == null) {
                    bestSA = sa;
                    bestRestriction = counterSpellRestriction(sa);
                } else {
                    // Compare bestSA with this SA
                    int restrictionLevel = counterSpellRestriction(sa);

                    if (restrictionLevel > bestRestriction) {
                        bestRestriction = restrictionLevel;
                        bestSA = sa;
                    }
                }
            }
        }

        if (bestSA == null)
            return false;

        // TODO
        // "Look" at Targeted SA and "calculate" the threshold
        // if (bestRestriction < targetedThreshold) return false;

        AllZone.getStack().freezeStack();
        Card source = bestSA.getSourceCard();

        if (bestSA.isSpell() && !source.isCopiedSpell())
            AllZone.getGameAction().moveToStack(source);

        Cost cost = bestSA.getPayCosts();

        if (cost == null) {
            // Honestly Counterspells shouldn't use this branch
            payManaCost(bestSA);
            bestSA.chooseTargetAI();
            bestSA.getBeforePayManaAI().execute();
            AllZone.getStack().addAndUnfreeze(bestSA);
        } else {
            Cost_Payment pay = new Cost_Payment(cost, bestSA);
            if (pay.payComputerCosts())
                AllZone.getStack().addAndUnfreeze(bestSA);
        }

        return true;
    }//playCounterSpell()