// ***  IMPORTS  ***
import java.util.*;
import java.io.*;
import java.lang.reflect.Array;

/**
 * class qui simule l’utilisation d’horaires de trains pour effectuer de la planification de trajets. 
 * @author G.MAROUSE 1C1
 */
class Planification {

    // Variables globales accessibles par toutes les méthodes
        /** trajets : Liste des trajets de trains */
    ArrayList<String> trajets = new ArrayList<String>();
        /** horaire : Liste des horaires de trains */
    ArrayList<Integer> horaires = new ArrayList<Integer>();


    /**
     * point d'entrée du programme
     */
    void principal() {
        testRemplirLesCollections();
        testAfficherHorairesEtDureeTrajets2Gares();
        testTrouverTousLesTrajets();
        testChercherCorrespondances();
    }


    /*** Les méthodes de test ***/

    /**
     * test de remplirLesCollections()
     */
    void testRemplirLesCollections() {
        System.out.println("################################# Test de remplirLesCollections() #################################");
        // Appel de la méthode à tester "cas normal"
        remplirLesCollections ( "../TrajetsEtHoraires.txt" );
        // Test VISUEL de la bonne lecture du fichier
        afficherHorairesEtDureeTousTrajets();
    }

    /**
     * test de afficherHorairesEtDureeTrajets2Gares()
     */
    void testAfficherHorairesEtDureeTrajets2Gares() {
        System.out.println("################################# Test de afficherHorairesEtDureeTrajets2Gares() #################################");
        // D’abord remplir les collections
        remplirLesCollections ( "../TrajetsEtHoraires.txt" );
        // Appel de la méthode à tester "cas normal"
        // Test VISUEL
        afficherHorairesEtDureeTrajets2Gares ("Vannes", "Redon");
    }

    /**
     * test de chercherCorrespondances()
     */
    void testChercherCorrespondances() {
        System.out.println("\n################################# Test de chercherCorrespondances() #################################");
        // D’abord remplir les collections
        remplirLesCollections ( "../TrajetsEtHoraires.txt" );
        // Appel de la méthode à tester "cas normal"
        testCasChercherCorrespondances("Rennes", new Duree(13,0,0), new ArrayList<String>());
        ArrayList<String> list = new ArrayList<String>();
        list.add("1");
        list.add("6");
        list.add("7");
        list.add("5");
        testCasChercherCorrespondances("Vannes", new Duree(8,0,0), list);
    }

    /**
     * test un cas d'appel de chercherCorrespondances()
     * @param gare - String : la gare de correspondance
     * @param heure - Duree : l'heure de correspondance
     * @param result - le resultat attendu
     */
    void testCasChercherCorrespondances(String gare, Duree heure, ArrayList<String> result){
		//affichage
		System.out.print("chercherCorrespondances("+gare+", "+heure.enTexte('H')+")\t=\t"+result.toString()+"\t:\t");
		//execution
		ArrayList<String> resExec = chercherCorrespondances(gare,heure);
		//test
		if (resExec.equals(result)){
			System.out.println("OK");
		}else{
			System.out.println("ERREUR");
		}
	}

    /**
     * test de trouverTousLesTrajets()
     */
    void testTrouverTousLesTrajets() {
        System.out.println("################################# Test de trouverTousLesTrajets() #################################");
        // D’abord remplir les collections
        remplirLesCollections ( "../TrajetsEtHoraires.txt" );
        String[] gares = new String[]{"Vannes","Redon","Rennes"};
        for (int i=0; i<gares.length; i++){
			// Appel de la méthode à tester "cas normal"
			ArrayList<String> res = trouverTousLesTrajets (gares[i]);
			// Test VISUEL
			System.out.println(gares[i]+"\t:\t"+res.toString());
		}
    }
    

    /*** Le code des méthodes demandées ***/

    /**
     * Methode qui rempli les listes trajets et horaires à partir d'un fichier
     * @param nomFich - String : le Path du fichier de planification
     */
    void remplirLesCollections ( String nomFich ) {
        this.trajets.clear();
        this.horaires.clear();
        int cpt=0;
        boolean eof = false; String str;
        BufferedReader tampon; FileReader file;
        try {
            tampon = new BufferedReader ( new
            FileReader ( nomFich ) );
            while ( ! eof ) {
                str = tampon.readLine();
                if ( str == null ) { eof = true; }
                else {
                    String[] strL=str.split("/");
                    if (cpt%2==0){
                        for (int i=0; i<strL.length; i++){
                            trajets.add(strL[i].trim());
                        }
                        cpt++;
                    }else{
                        for (int i=0; i<strL.length; i++){
                            horaires.add(Integer.parseInt(strL[i].trim()));
                        }
                        cpt++;
                    }
                }
            }
            tampon.close();
        }
        catch (FileNotFoundException e) {
            System.out.println ( e.getMessage() );
        }
        catch (IOException e) {
            System.out.println ( e.getMessage() );
        }
    }

    /**
     * méthode d'affichage des trajets et horraires de tous les train enregistrés
     */
    void afficherHorairesEtDureeTousTrajets() {
        for (int i=0; i<trajets.size(); i+=4){
            int id=Integer.parseInt(trajets.get(i));
            Duree depart=null;
            Duree arrive=null;
            Duree duree=null;
            for (int j=0; j<horaires.size(); j+=5){
                if (horaires.get(j)==id){
                    depart= new Duree(horaires.get(j+1),horaires.get(j+2),0);
                    arrive= new Duree(horaires.get(j+3),horaires.get(j+4),0);
                    duree = new Duree(horaires.get(j+3),horaires.get(j+4),0);
                    duree.soustraire(depart);
                }
            }
            System.out.println("Train "+trajets.get(i+1)+"\tnumero : "+id);
            System.out.println("\tDépart de "+trajets.get(i+2)+" à "+depart.enTexte('H'));
            System.out.println("\tArrivée à "+trajets.get(i+3)+" à "+arrive.enTexte('H'));
            System.out.println("\tDurée du trajet - "+duree.enTexte('H')+"\n");
        }
    }

    /**
     * methode d'affichage des trajets directs d'une gare à une autre
     * @param gareDep - String : la gare de départ
     * @param gareDest - String : la gare de destination
     */
    void afficherHorairesEtDureeTrajets2Gares ( String gareDep, String gareDest ) {
        for (int i=0; i<trajets.size(); i+=4){
            if(gareDep.equals(trajets.get(i+2)) && gareDest.equals(trajets.get(i+3))){
                int id=Integer.parseInt(trajets.get(i));
                Duree depart=null;
                Duree arrive=null;
                Duree duree=null;
                for (int j=0; j<horaires.size(); j+=5){
                    if (horaires.get(j)==id){
                        depart= new Duree(horaires.get(j+1),horaires.get(j+2),0);
                        arrive= new Duree(horaires.get(j+3),horaires.get(j+4),0);
                        duree = new Duree(horaires.get(j+3),horaires.get(j+4),0);
                        duree.soustraire(depart);
                    }
                }
                System.out.println("Train "+trajets.get(i+1)+"\tnumero : "+id);
                System.out.println("\tDépart de "+trajets.get(i+2)+" à "+depart.enTexte('H'));
                System.out.println("\tArrivée à "+trajets.get(i+3)+" à "+arrive.enTexte('H'));
                System.out.println("\tDurée du trajet - "+duree.enTexte('H')+"\n");
            }
        }
    }
    
    /**
     * méthode qui récupére les identifiants des trajet de correspondance depuis une gare donnée passé une horaire donnée
     * @param gare - String : la gare de correspondance
     * @param heure - Duree : l'heure de début de la carrespondance
     * @return ArrayList&gt;String&lt; la liste des identifiants des trajets depuis la gare après l'heure donnée
     */
    ArrayList<String> chercherCorrespondances ( String gare, Duree heure ) {
        ArrayList<String> res = new ArrayList<String>();
		ArrayList<String> ids = trouverTousLesTrajets(gare);
		for (int i=0; i<ids.size(); i++){
			int[] h = obtenirInfosUnHoraire(ids.get(i));
			Duree depart = new Duree(h[0],h[1],0);
			if(depart.compareA(heure)==1){
				res.add(ids.get(i));
			}
		}
		
        return res;
    }

    /**
     * méthode qui permet d'obtenir les information d'un trajet
     * @param idTrajet - String : l'identifiant du trajet
     * @return String[] : le tableau contenant les infos sur le trajet : {type Train, Gare départ, Gare arrivée}
     */
    String[] obtenirInfosUnTrajet ( String idTrajet ) {
		String[] infos = new String[3];
		for (int i=0; i<trajets.size(); i+=4){
			if (trajets.get(i).equals(idTrajet)){
				infos[0]=(trajets.get(i+1));
				infos[1]=(trajets.get(i+2));
				infos[2]=(trajets.get(i+3));
			}
		}
		return infos;
    }

    /**
     * méthode qui permet d'obtenir les information sur les horaires d'un trajet
     * @param idTrajet - String : l'identifiant du trajet
     * @return int[] : le tableau contenant les horaires du trajet : {heure départ, minute départ, heure arrivée, minute arrivée}
     */
    int[] obtenirInfosUnHoraire ( String idTrajet ) {
		int id = Integer.parseInt(idTrajet);
		int[] h = new int[4];
		for (int i=0; i<horaires.size(); i+=5){
			if (id == horaires.get(i)){
				for (int j=0; j<h.length; j++){
					h[j]=horaires.get(i+j+1);
				}
			}
		}
		return h;
    }
    
    /**
     * methode qui récupère la liste des identifiants des trajets de train enregistrés depuis une gare donnée
     * @param gareDep - String : la gare de départ des trajets à séléctionnés
     * @return ArrayList&gt;String&lt; : la liste des identifiants des trajet depuis gareDep
     */
    ArrayList<String> trouverTousLesTrajets ( String gareDep ) {
		ArrayList ids = new ArrayList<String>();
		for (int i=0; i<trajets.size(); i+=4){
			if (trajets.get(i+2).equals(gareDep)){
				ids.add(trajets.get(i));
			}
		}
		return ids;
    }
}
