package org.ggp.base.apps.validator;

import java.util.List;

import org.ggp.base.util.game.CloudGameRepository;
import org.ggp.base.util.game.Game;
import org.ggp.base.util.game.GameRepository;
import org.ggp.base.validator.BasesInputsValidator;
import org.ggp.base.validator.GameValidator;
import org.ggp.base.validator.OPNFValidator;
import org.ggp.base.validator.SimulationValidator;
import org.ggp.base.validator.StaticValidator;
import org.ggp.base.validator.ValidatorException;
import org.ggp.base.validator.ValidatorWarning;

import com.google.common.collect.ImmutableList;

/**
 * BatchValidator does game validation on all of the games in a given game repository.
 * This allows you to quickly determine which games need to be repaired, given a large
 * existing game repository with games of varying quality.
 *
 * @author schreib
 */
public final class BatchValidator
{
    public static void main(String[] args)
    {
        GameRepository repo = new CloudGameRepository("games.ggp.org/base");
        for (String gameKey : repo.getGameKeys()) {
            if (gameKey.contains("amazons") || gameKey.contains("knightazons") || gameKey.contains("factoringImpossibleTurtleBrain") || gameKey.contains("quad") || gameKey.contains("blokbox") || gameKey.contains("othello"))
                continue;
            Game game = repo.getGame(gameKey);
            GameValidator[] theValidators = new GameValidator[] {
                    new StaticValidator(),
                    new BasesInputsValidator(3000),
                    new SimulationValidator(300, 10),
                    new OPNFValidator(),
            };
            System.out.print(gameKey + " ... ");
            System.out.flush();
            boolean isValid = true;
            List<ValidatorWarning> warnings = ImmutableList.of();
            for (GameValidator theValidator : theValidators) {
                try {
                    warnings = theValidator.checkValidity(game);
                } catch (ValidatorException ve) {
                    System.out.println("Failed: " + ve);
                    isValid = false;
                    break;
                }
            }
            if (isValid) {
                if (warnings.isEmpty()) {
                    System.out.println("Passed!");
                } else {
                    System.out.println("Passed with warnings: " + warnings);
                }
            }
        }
    }
}