package curve;

import java.util.*;
import gradebook.*;
/**
 * The Histogram class defines the necessary components for graphically changing the GradeScheme
 *
 * Derived from the requirements documentation regarding visuals.
 */
public abstract class Histogram extends AbstractGraph
{
	/**
	 * GradeScheme used to project how a particular adjustment will propagate. Pushed to the Section once the user finalizes their choice with apply().
	 */
	GradeScheme tempGradeScheme;
	/**
	 * Given a particular letter grade and new lowerbound, this method will apply them to the temporary GradeScheme.
	 * 
	 * @param letterGrade The LetterGrade that has been changed
	 * @param newLowerBound The new Percentage that denotes the LetterGrade's new lower bound.
	 * <pre>
	 post:
	   //The LetterGrade and Percentage have been properly applied to the tempGradeScheme and no other changes have been made
	   forall (DivisionBar divisionBar; 
	    	tempGradeScheme'.divisions.contains(divisionBar) iff 
	   			(divisionBar.letterGrade.equals(letterGrade) && divisionBar.low.equals(newLowerBound))
	   			||
	   			tempGradeScheme.divisions.contains(divisionBar));
	 */
	abstract void adjustCurve(LetterGrade letterGrade, Percentage newLowerBound);
	/**
	 * Changes made via the GUI manipulations will be pushed over to the full model.
	 post:
	 	//The GradeScheme of the Section must be identical to the tempGradeScheme.
	 	forall (DivisionBar divisionBar;
	 		tempGradeScheme.contains(divisionBar);
	 		exists(DivisionBar sDivisionBar; section'.gradeScheme.divisions.contains(sDivisionBar); divisionBar.equals(sDivisionBar)));	
	 */
	abstract void apply();
}