import java.util.LinkedHashSet;

// Copyright Florent Madelaine, (3 juin 2020) 

// florent.madelaine@u-pec.fr

// Ce logiciel est un programme informatique simulant une petite partie du jeu de Memory

// Ce logiciel est regi par la licence CeCILL soumise au droit francais et
// respectant les principes de diffusion des logiciels libres. Vous pouvez
// utiliser, modifier et/ou redistribuer ce programme sous les conditions
// de la licence CeCILL telle que diffusee par le CEA, le CNRS et l'INRIA 
// sur le site "http://www.cecill.info".

// En contrepartie de l'accessibilite au code source et des droits de copie,
// de modification et de redistribution accordes par cette licence, il n'est
// offert aux utilisateurs qu'une garantie limitee.  Pour les memes raisons,
// seule une responsabilite restreinte pese sur l'auteur du programme,  le
// titulaire des droits patrimoniaux et les concedants successifs.

// A cet egard  l'attention de l'utilisateur est attiree sur les risques
// associes au chargement,  a l'utilisation,  a la modification et/ou au
// developpement et a la reproduction du logiciel par l'utilisateur etant 
// donne sa specificite de logiciel libre, qui peut le rendre complexe a 
// manipuler et qui le reserve donc a des developpeurs et des professionnels
// avertis possedant  des  connaissances  informatiques approfondies.  Les
// utilisateurs sont donc invites a charger  et  tester  l'adequation  du
// logiciel a leurs besoins dans des conditions permettant d'assurer la
// securite de leurs systemes et ou de leurs donnees et, plus generalement, 
// a l'utiliser et l'exploiter dans les memes conditions de securite. 

// Le fait que vous puissiez acceder a cet en-tete signifie que vous avez 
// pris connaissance de la licence CeCILL, et que vous en avez accepte les
// termes.



/**
 * Classe gerant la table de jeu du Memory dans le modele
 * Pour l'instant ne gere pas le tour des joueurs.
 * Devrait probablement le faire un jour.
 */
public class Table extends EnsembleCarte {
       
    /**
     * Constructeur de Table vide (seul constructeur pour l'instant)
     */
    public Table(){
    }

    /**
     * Necessaire de la rendre publique car on a un parti pris que on commence avec une table vide a laquelle on ajoute des cartes.
     * On pourrait alternativement faire un constructeur qui fabrique les cartes ou bien qui prend une collection de cartes.
     * ca n'aurait pas la vertu pedagogique de montrer qu'on peut surcharger une methode en elevant les droits en java.
     * 
     * Par delegation mais en rendant publique la methode (pour l'initialisation en fait).
     * @param  c Carte a ajou
     * @return true si la carte est ajoutee a l'ensemble
     * @throws NullPointerException si la carte est null
     * @throws IllegalStateException si la carte ne peut pas etre ajoutee car elle est deja presente dans l'ensemble  
     */
    @Override
    public boolean add(Carte c){
        return super.add(c);
    }

    /**
     * revele une carte.
     * @param c une carte a reveler
     * @throws NullPointerException si la carte est null
     * @throws IllegalArgumentException si la carte n'est pas sur la table
     * @throws IllegalStateException si la carte est deja revelee 
     */
    public void reveler(Carte c){
        c.toggleVisible(); 
    }

	/**
     * cache une carte.
     * @param c une carte a cacher
     * @throws NullPointerException si la carte est null
     * @throws IllegalArgumentException si la carte n'est pas sur la table
     * @throws IllegalStateException si la carte est deja cachee 
     */
    public void cacher(Carte c){
        c.toggleVisible(); 
    }


    public String toString(){
        return "Table " + super.toString();
    }


    public static void main(String[] args) {
        // c'est un peu moche mais on peut pour simplifier mettre des tests manuels dans un main dans chaque classe.
        // C'est plutot mieux que de mettre des print dans chaque methode car vous etes plus sur de la stabilite de vos tests (vous pouvez rejouer les tests plus tard).

        // Les cartes
        Carte un = new Carte(1);
        Carte deux = new Carte (2);
        Carte unBis = new Carte(1);
        Carte deuxBis = new Carte(2);


        // la Table
        Table t = new Table();
        t.add(un);
        t.add(deux);
        t.add(unBis);
        t.add(deuxBis);

        System.out.println(t);

        t.reveler(un);
        t.reveler(unBis);
        
        System.out.println(t);
                
    }
}


