package av2010;

/**
 * 
 * @author lombardy
 *
 * Exercice 8
 *
 */

public class Operation extends OperateurBinaire implements Fonction{
	private final Operateur op;
	
	public Operation(Operateur op, Fonction first, Fonction second) {
		super(first, second);
		this.op = op;
	}

	@Override
	public Fonction derivee() {
		switch(op){
		case Plus: case Moins:
			return new Operation(op,getFirst().derivee(), getSecond().derivee());
		case Mult: return new Operation(Operateur.Plus,
										new Operation(op,getFirst().derivee(), getSecond()),
										new Operation(op,getFirst(), getSecond().derivee()));
		case Div: return new Operation(op,
				      new Operation(Operateur.Moins,
				new Operation(Operateur.Mult,getFirst().derivee(), getSecond()),
				new Operation(Operateur.Mult,getFirst(), getSecond().derivee())),
				      new Operation(Operateur.Mult, getSecond(), getSecond()));

		}
		return null;
	}

	@Override
	public double evalue(double x) {
		switch(op){
		case Div: return getFirst().evalue(x) / getSecond().evalue(x);
		case Mult: return getFirst().evalue(x) * getSecond().evalue(x);
		case Plus: return getFirst().evalue(x) + getSecond().evalue(x);
		case Moins: return getFirst().evalue(x) - getSecond().evalue(x);
		}
		return 0;
	}

	@Override
	public void setNomVariable(String var) {
		getFirst().setNomVariable(var);
		getSecond().setNomVariable(var);
	}

	@Override
	public String toString(){
		char s=' ';
		switch(op){
		case Div: s='/'; break;
		case Mult: s='*'; break;
		case Plus: s='+'; break;		
		case Moins: s='-'; break;		
		}
		return "("+getFirst()+')'+s+'('+getSecond()+")";
	}
}
