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.command.exceptions.CommandException;
import com.interpress_project.modernshare.client.controller.model.LocalModelManager;
import com.interpress_project.modernshare.client.controller.model.LocalRoot;
import com.interpress_project.modernshare.client.events.GUIEvent;
import com.interpress_project.modernshare.client.events.GUIEventType;
import com.interpress_project.modernshare.client.events.LocalViewEvent;
import com.interpress_project.modernshare.client.events.LogEvent;
import com.interpress_project.modernshare.client.events.LogEventType;
import com.interpress_project.modernshare.client.events.ViewEventType;
import com.interpress_project.modernshare.client.view.ViewManager;
import com.interpress_project.modernshare.ipcommon.SystemBase;

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

	/**
	 * SyncDataAction
	 * @param vmgr
	 * @param item
	 */
	public StartupSyncAction(final ViewManager vmgr) {
		setText("データセンタからホットショットフォルダを同期(&S)");
		setToolTipText("データセンタのデータでホットショットフォルダを同期します。");
		try {
			setImageDescriptor(ImageFactory.getInstance().getImageDescriptor("syncserver"));
		}
		catch (Exception ex) {
			sb.getLogger().fatal("リソース設定のエラーが発生しました。", ex);
			System.exit(-1);
		}
		this.vmgr = vmgr;
	}

	/**
	 * run
	 */
	public void run() {
		TaskManager taskmgr = TaskManager.getInstance();
		try {
			taskmgr.stop();
			/**
			 * update Local XML file.
			 */
			cmdmgr.execCommand(factory.createUpdateClientXMLCommand());

			localViewEventSource.fireEvent(new LocalViewEvent(this, ViewEventType.REFRESH));

			/**
			 * ローカルターゲットリストを同期
			 */
			cmdmgr.execCommand(factory.createSyncListCommand());

			final LocalModelManager lmmgr = LocalModelManager.getInstance();
			final LocalRoot[] roots = lmmgr.getRootLineItem().getActiveRoots();
			if (roots.length == 0) {
				vmgr.getDialogManager().createInformationMessageDialog("データセンタとの同期確認", "自動更新モードのホットショットフォルダは登録されていません。");
				return;
			}

			boolean bResult = vmgr.getDialogManager().createYesNoMessageDialog("データセンタとの同期確認",
			  "全てのホットショットフォルダを、データセンタと同期しますか? (データセンタに格納されたデータでローカルPCのホットショットフォルダが更新されます。)");
			if (bResult == false) {
				return;
			}

			for (int i = 0; i < roots.length; i++) {
				try {
					String msg = "ホットショットフォルダ" + roots[i].getAbsolutePath() + "をデータセンタのデータで同期しています...";
					guiEventSource.fireEvent(new GUIEvent(this, msg, GUIEventType.START));
					cmdmgr.execCommand(factory.createSyncLocalWithRemoteCommand(roots[i]));
				}
				finally {
					String msg = "ホットショットフォルダ" + roots[i].getAbsolutePath() + "の同期が終了しました。";
					guiEventSource.fireEvent(new GUIEvent(this, msg, GUIEventType.FINISH));
					roots[i].setDirty(false);
				}
			}
		}
		catch (CommandException ex) {
			String msg = ex.getCause().getMessage();
			logEventSource.fireEvent(new LogEvent(this, msg, LogEventType.ERROR, ex));
			vmgr.getDialogManager().createErrorMessageDialog(msg);
		}
		finally {
			taskmgr.start();
		}
	}
}
