import InitialSchedules.InitialSchedulesArray;
import org.chocosolver.solver.Solution;
import org.chocosolver.solver.Solver;
import org.chocosolver.solver.exception.ContradictionException;

import java.util.ArrayList;
import java.util.List;

public class MainClass {

    public static void main(String[] args) {

        // Le main ne devrait contenir que les 5 fonctions correspondantes aux etapes du pipeline
        generateInitialSchedule();

        // Creer les simulation avec une autre classe. Faire un nouveau package de fonctions.
        // Algo de recouvrement d'absences. Faire un nouveau package de fonctions.
        // Trouver meilleure solution et l'afficher.
    }

    private static void generateInitialSchedule() {

        InitialSchedules.ParametersInitialSchedules myScheduleParameters
                = new InitialSchedules.ParametersInitialSchedules();

        InitialSchedules.ModelInitialSchedules myModelInitialSchedules
                = new InitialSchedules.ModelInitialSchedules(myScheduleParameters);

        Solver solverInitialSchedules = myModelInitialSchedules.chocoModelInitialSchedules.getSolver();

        try {
            solverInitialSchedules.propagate();
        } catch (ContradictionException e) {
            System.err.println("Caught ContradictionException: " + e.getMessage());
            solverInitialSchedules.getEngine().flush();
        } catch (Exception e) {
            System.err.println("Caught Exception: " + e.getMessage());
        }

        //solverInitialSchedules.showDashboard();
        /*solverInitialSchedules.setSearch(Search.domOverWDegSearch(myModelInitialSchedules.allWorkPeriods));*/
        //solverInitialSchedules.setRestartOnSolutions(); /*Sans restart, toutes les horaires sont identiques*/
        solverInitialSchedules.limitSolution(100);
        solverInitialSchedules.limitTime(10000);
        List<Solution> myInitialSchedulesSolutions;
        myInitialSchedulesSolutions = solverInitialSchedules.findAllSolutions
                (/*myModelInitialSchedules.TotalEmployeesSalary, Model.MINIMIZE*/);

        // fonction pour reduire le nombre d'horaire dans la banque d'horaire.
        // InitialSchedules.UtilInitialSchedules.refineInitialSchedules(bestInitialSchedules);
        // On pourrait creer un petit interface pour afficher les horaires optimales et les statistiques.
        InitialSchedules.UtilInitialSchedules.printSolutionResults(myModelInitialSchedules, myScheduleParameters);
        solverInitialSchedules.printStatistics();

        // Création de l'objet banque d'horaire, qui est une liste d'objets de type InitialSchedulesArray, qui contiennent chacun deux tableaux.

        List<InitialSchedules.InitialSchedulesArray> InitialSchedulesArrayList = new ArrayList<>();

        for (Solution CurrentSolution : myInitialSchedulesSolutions) {
            InitialSchedulesArray isa = new InitialSchedules.InitialSchedulesArray(myModelInitialSchedules, CurrentSolution);
            InitialSchedulesArrayList.add(isa);
        }

        // Imprimer la liste de matrices
        /*for (InitialSchedulesArray isa: InitialSchedulesArrayList) {
            System.out.println(Arrays.deepToString(isa.InitialPartTimeSchedules));
        }
        for (InitialSchedulesArray isa: InitialSchedulesArrayList) {
            System.out.println(Arrays.deepToString(isa.InitialFullTimeSchedules));
        }*/
    }
}
