package cc.ptt;

public class CountDown {
    public interface OnTickListener {
		public void onTick(int seconds);
	}
	
	private static class NullTickListener implements OnTickListener {
		@Override
		public void onTick(int seconds) {
		}
	}
	
	private static final OnTickListener nullListener =
			new NullTickListener();
	private OnTickListener tickListener = nullListener;
	
	public void asyncStart(final int seconds) {
		// run in some worker thread
		new Thread(new Runnable() {
			public void run() {
				try {
					count(tickListener, seconds);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}).start();
	}
	
	public void syncStart(int seconds) {
		// run in the caller thread
		try {
			count(tickListener, seconds);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	private void count(OnTickListener listener, int timeInSecs)
			throws InterruptedException {
		if (timeInSecs <= 0) {
			listener.onTick(0);
			return;
		}
		listener.onTick(timeInSecs);
		Thread.sleep(1000);
		count(listener, timeInSecs - 1);
	}
	
	public OnTickListener getTickListener() {
		return tickListener == nullListener? null : tickListener;
	}
	public void setTickListener(OnTickListener tickListener) {
		if (tickListener == null)
			this.tickListener = nullListener;
		else
			this.tickListener = tickListener;
	}
}
