import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.*;

/** feuille du motif composite */
public class Chef extends Person {

    private List<Person> listeSubalterne;

    public boolean addSubalterne(Person p){
        return this.listeSubalterne.add(p);
    }


    
    /** constructeur
     *
     * @param n fun factor
     *
     */ 
    public Chef(int n){
        super(n);
        this.listeSubalterne = new ArrayList<>();
    }

    
    /** 
     * La meilleure fête avec moi, c'est la meilleure fête sans mes subalternes pour eux plus moi. 
     *
     * @return retourne la valeur de la meilleure fête en invitant seulement les gens dont cette personne est le ou la supérieure hiérarchique, mais pas elle.
     *
     */ 
    public int bestPartyWithoutMe(){
            int fun = 0;
            for (Person invitee : this.listeSubalterne){
                fun += invitee.bestParty();
            }
        return fun;
    }

    /** 
     * La meilleure fête avec moi, c'est la meilleure fête sans mes subalternes pour eux plus moi. 
     *
     * @return retourne la valeur de la meilleure fête en invitant seulement les gens dont cette personne est le ou la supérieure hiérarchique, mais pas elle.
     *
     */ 
    private int bestPartyWithMe(){
            int fun = this.getFunFactor();
            for (Person invitee : this.listeSubalterne){
                fun += invitee.bestPartyWithoutMe();
            }
        return fun;
    }

    /**
     *  La meilleure fête est soit sans moi (c'est l'union des meilleures fêtes de mes subalternes). 
     *  soit c'est la meilleure fête avec moi.
     *
     * @return la valeur de la meilleure fête en invitant seulement les gens dont cette personne est le ou la supérieure hiérarchique (peut-être avec elle).
     *
     */ 
    public int bestParty(){
        return Math.max(this.bestPartyWithMe(), this.bestPartyWithoutMe());
    }
    
}


