package controlP5;

/**
 * controlP5 is a processing gui library.
 *
 * 2006-2015 by Andreas Schlegel
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General
 * Public License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 * Boston, MA 02111-1307 USA
 *
 * @author 		Andreas Schlegel (http://www.sojamo.de)
 * @modified	##date##
 * @version		##version##
 *
 */

/**
 * control timer is a timer that can be used for example as a stop watch or a duration timer.
 * 
 * @example controllers/ControlP5timer
 */
public class ControlTimer {

	long millisOffset;

	int ms, s, m, h, d;

	float _mySpeed = 1;

	int current, previous;

	/**
	 * create a new control timer, a timer that counts up in time.
	 */
	public ControlTimer() {
		reset();
	}

	/**
	 * return a string representation of the current status of the timer.
	 * 
	 * @return String
	 */
	public String toString() {
		update();
		return (((h < 10) ? "0" + h : "" + h) + " : " + ((m < 10) ? "0" + m : "" + m) + " : " + ((s < 10) ? "0" + s : "" + s) // +
																																// " : "
																																// +
		// ((ms<100) ? "0" + ms: "" +ms)
		);
	}

	/**
	 * called to update the timer.
	 */
	public void update() {
		current = (int) time();
		if (current > previous + 10) {
			ms = (int) (current * _mySpeed);
			s = (int) (((current * _mySpeed) / 1000));
			m = (int) (s / 60);
			h = (int) (m / 60);
			d = (int) (h / 24);
			ms %= 1000;
			s %= 60;
			m %= 60;
			h %= 24;
			previous = current;
		}

	}

	/**
	 * get the time in milliseconds since the timer was started.
	 * 
	 * @return long
	 */
	public long time() {
		return (System.currentTimeMillis() - millisOffset);
	}

	/**
	 * reset the timer.
	 */
	public void reset() {
		millisOffset = System.currentTimeMillis();
		current = previous = 0;
		s = 0; // Values from 0 - 59
		m = 0; // Values from 0 - 59
		h = 0; // Values from 0 - 23
		update();
	}

	/**
	 * set the speed of time, for slow motion or high speed.
	 * 
	 * @param theSpeed int
	 */
	public void setSpeedOfTime(float theSpeed) {
		_mySpeed = theSpeed;
		update();
	}

	/**
	 * Get the milliseconds of the timer.
	 */
	public int millis() {
		return ms;
	}

	/**
	 * Seconds position of the timer.
	 */
	public int second() {
		return s;
	}

	/**
	 * Minutes position of the timer.
	 */
	public int minute() {
		return m;
	}

	/**
	 * Hour position of the timer in international format (0-23).
	 */
	public int hour() {
		return h;
	}

	/**
	 * day position of the timer.
	 */
	public int day() {
		return d;
	}

}
