/*
-----------------------------------------------------------------------
-- Copyright (C) 2011-2016                                           --
-- University of Firenze, Italy	                                     --
--                                                                   --
-- All rights reserved. This program and the accompanying materials  --
-- are made available under the terms of the Eclipse Public License  --
-- v1.0 which accompanies this distribution, and is available at     --
-- http://www.eclipse.org/legal/epl-v20.html                         --
--                                                                   --
-- Contributors:                                                     --
-- Leonardo Montecchi 	lmontecchi@unifi.it                          --
-----------------------------------------------------------------------
*/

package org.polarsys.chess.statebased.daemon;

import java.io.Serializable;
import java.util.Formatter;

public class DEEMProgressInformation implements Serializable {
	private int iCurrent;	//Performed batches
	private int iMin;		//Minimum batches
	private int iMax;		//Maximum batches
	
	public int getCurrent() {
		return iCurrent;
	}
	
	public int getMinimum() {
		return iMin;
	}
	
	public int getMaximum() {
		return iMax;
	}
	
	public int getMissing() {
		if(iMin - iCurrent > 0) {
			return iMin - iCurrent;
		}else {
			return 0;
		}
	}
	
	public boolean minimumReached() {
		return getMissing() == 0;
	}
	
	public float getPercentToMax() {
		return (float)iCurrent/iMax*100;
	}
	
	public String getPercentToMax(String format) {
		Formatter f = new Formatter();
		return f.format(format, (float)iCurrent/iMax*100).toString();
	}	
		
	public float getPercentToMin() {
		return (float)iCurrent/iMin*100;
	}

	public String getPercentToMin(String format) {
		Formatter f = new Formatter();
		return f.format(format, (float)iCurrent/iMin*100).toString();
	}
	
	public void setStatus(int min, int max, int current) {
		iMin = min;
		iMax = max;
		iCurrent = current;
	}
	
	public void setStatus(int current) {
		setStatus(getMinimum(), getMaximum(), current);
	}
	
	public String toString() {
		String s = getCurrent() + " of " + getMaximum() + " batches completed (";
		s += getPercentToMax("%.2f");
		s += "% of max"; 
		if(!minimumReached()) {
			s += " | " + getMissing() + " to min";
		}
		s += ")";
		return s;
	}
}
