package com.interpress_project.modernshare.client.controller.actions;

import com.interpress_project.modernshare.client.controller.command.SVNCommandFactory;
import com.interpress_project.modernshare.client.controller.command.SVNCommandManager;
import com.interpress_project.modernshare.client.controller.command.TaskManager;
import com.interpress_project.modernshare.client.controller.model.LocalRoot;
import com.interpress_project.modernshare.client.controller.model.RootStatus;
import com.interpress_project.modernshare.client.events.GUIEvent;
import com.interpress_project.modernshare.client.events.GUIEventType;
import com.interpress_project.modernshare.client.events.LogEvent;
import com.interpress_project.modernshare.client.events.LogEventType;
import com.interpress_project.modernshare.client.view.ViewManager;

/**
 *@stereotype action
 */
public final class ActivateTargetAction extends ActionAdaptor {
	private final SVNCommandManager cmdmgr = SVNCommandManager.getInstance();
	private final SVNCommandFactory factory = SVNCommandFactory.getInstance();
	private ViewManager vmgr;
	private LocalRoot item;

	/**
	 * ActivateTargetAction
	 * @param vmgr
	 * @param path
	 */
	public ActivateTargetAction(ViewManager vmgr, LocalRoot item) {
		setText("自動監視を開始(&S)");
		setToolTipText("対象となるホットショットフォルダに対する自動監視を開始します。");
		try {
			setImageDescriptor(ImageFactory.getInstance().getImageDescriptor("connected"));
		}
		catch (Exception ex) {
			sb.getLogger().fatal("リソース設定のエラーが発生しました。", ex);
			System.exit(-1);
		}
		this.vmgr = vmgr;
		this.item = item;
	}

	/**
	 * setActive
	 * @param path
	 */
	private void setActive(String path) {
		cmdmgr.addCommand(factory.createActiveTargetCommand(path, RootStatus.active));
	}

	/**
	 * run
	 */
	public void run() {
		int mode = -1;

		TaskManager taskmgr = TaskManager.getInstance();
		try {
			taskmgr.stop();

			boolean bAnswer = vmgr.getDialogManager().createYesNoMessageDialog("自動監視の開始確認",
			  "ホットショットフォルダ" + item.getAbsolutePath() + "に対する自動監視を開始します。");
			if (bAnswer == false) {
				return;
			}

			/**
			 * ターゲットフォルダがROであればダイアログは表示せずに、Host2PCを実行する。
			 */
			if (item.getPc2host()) {
				mode = vmgr.getDialogManager().createSyncModeDialog();
				if (mode == -1) { // Selected CANCEL
					return;
				}
			}
			else {
				mode = 1; // ノードがHost2Pcであれば同期はRemote->PCのみ。ダイアログ不要。				
			}

			guiEventSource.fireEvent(new GUIEvent(this, item.getAbsolutePath() + "への自動監視を開始します...", GUIEventType.START));

			switch (mode) {
				default: {
					return;
				}
				case 0: {
					cmdmgr.addCommand(factory.createSyncRemoteWithLocalCommand(item));
					break;
				}
				case 1: {
					cmdmgr.addCommand(factory.createSyncLocalWithRemoteCommand(item));
					break;
				}
			}
			setActive(item.getAbsolutePath());

			logEventSource.fireEvent(new LogEvent(this, "ホットショットフォルダ" + item.getAbsolutePath() + "に対する自動監視を開始しました。",
			  LogEventType.INFO));
		}
		finally {
			guiEventSource.fireEvent(new GUIEvent(this, "ホットショットフォルダ" + item.getAbsolutePath() + "の自動監視を開始しました。",
			  GUIEventType.FINISH));
			taskmgr.start();
		}
	}
}
