package ender.timer;
import haven.Coord;
import haven.Label;
import haven.UI;
import haven.Window;
public class Timer {
private static final int SERVER_RATIO = 3;
public static long server;
public static long local;
private long start;
private long time;
private String name;
private long seconds;
public Callback updcallback;
public Timer(long start, long time, String name) {
this.start = start;
this.time = time;
this.name = name;
TimerController.getInstance().add(this);
}
public Timer(long time, String name) {
this(0, time, name);
}
public boolean isWorking() {
return start != 0;
}
public void stop() {
start = 0;
if (updcallback != null) {
updcallback.run(this);
}
TimerController.getInstance().save();
}
public void start() {
start = server + SERVER_RATIO * ((System.currentTimeMillis() / 1000) - local);
TimerController.getInstance().save();
}
public void start(long start) {
this.start = start;
}
public synchronized boolean update() {
long now = System.currentTimeMillis() / 1000;
seconds = time - now + local - (server - start) / SERVER_RATIO;
if (seconds <= 0) {
Window wnd = new Window(new Coord(250, 100), Coord.z, UI.instance.root, "Timer");
String str;
if (seconds < -60) {
str = String.format("%s elapsed since timer named \"%s\" finished it's work", toString(), name);
} else {
str = String.format("Timer named \"%s\" just finished it's work", name);
}
new Label(Coord.z, wnd, str);
wnd.justclose = true;
wnd.pack();
return true;
}
if (updcallback != null) {
updcallback.run(this);
}
return false;
}
public synchronized long getStart() {
return start;
}
public synchronized void setStart(long start) {
this.start = start;
}
public synchronized String getName() {
return name;
}
public synchronized void setName(String name) {
this.name = name;
}
public synchronized void setTime(long time) {
this.time = time;
}
public synchronized long getTime() {
return time;
}
@Override
public String toString() {
long t = Math.abs(isWorking() ? seconds : time);
int h = (int) (t / 3600);
int m = (int) ((t % 3600) / 60);
int s = (int) (t % 60);
return String.format("%d:%02d:%02d", h, m, s);
}
public void destroy() {
TimerController.getInstance().remove(this);
updcallback = null;
}
}