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

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

    private List<Person> subalternes = new ArrayList<Person>(); 
    private Integer avec,sans = null;

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


    
    /** constructeur
     *
     * @param n fun factor
     *
     */ 
    public Chef(int n){
        super(n);
        // d'autres choses peut-être.
    }

    
    /** 
     * 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(){
        if (this.sans != null) {
            return this.sans;
        }
        int output = 0;
        for (Person person : subalternes) {
            output += person.bestParty();
        }
        this.sans = output;
        return output;
    }

    /** 
     * 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(){
        if (this.avec != null) {
            return this.avec;
        }
        int output = getFunFactor();
        for (Person person : subalternes) {
            output += person.bestPartyWithoutMe();
        }
        this.avec = output;
        return output; 
    }

    /**
     *  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(){
        if (this.avec != null && this.sans != null) {
            if (this.avec > sans) {
                return this.avec;
            } else {
                return this.sans;
            }
        }
        this.avec = this.bestPartyWithMe();
        this.sans = this.bestPartyWithoutMe();
        if (this.avec > this.sans) {
            return this.avec;
        } else {
            return this.sans;
        }
        
    }
}


