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

import java.util.ArrayList;

import org.eclipse.jface.dialogs.MessageDialog;

import com.interpress_project.modernshare.AppKeys;
import com.interpress_project.modernshare.client.controller.command.TaskManager;
import com.interpress_project.modernshare.client.controller.delegate.LocalSVNManager;
import com.interpress_project.modernshare.client.controller.delegate.exceptions.ConnectionFailException;
import com.interpress_project.modernshare.client.controller.delegate.exceptions.InternalFailException;
import com.interpress_project.modernshare.client.controller.model.LocalModelManager;
import com.interpress_project.modernshare.client.controller.model.SVNRoot;
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 RegisterTargetAction extends ActionAdaptor {
	private final ViewManager vmgr;
	private final LocalSVNManager svnmgr = LocalSVNManager.getInstance();

	/**
	 * RegisterTargetAction
	 * @param vmgr
	 */
	public RegisterTargetAction(ViewManager vmgr) {
		setText("ホットショットフォルダを登録(&R)");
		setToolTipText("ローカルフォルダをホットショットフォルダとして登録します。");
		try {
			setImageDescriptor(ImageFactory.getInstance().getImageDescriptor("register"));
		}
		catch (Exception ex) {
			sb.getLogger().fatal("リソース設定のエラーが発生しました。", ex);
			System.exit(-1);
		}
		this.vmgr = vmgr;
	}

	/**
	 * run
	 */
	public void run() {
		TaskManager taskmgr = TaskManager.getInstance();
		ArrayList<SVNRoot> list = null;

		try {
			taskmgr.stop();

			logEventSource.fireEvent(new LogEvent(this, LogEventType.CLEAR));

			if (LocalModelManager.getInstance().canRegisterMore() == false) {
				vmgr.getDialogManager().createErrorMessageDialog(
				  "管理フォルダは最大" + AppKeys.MAX_TARGETS + "つまで登録できます。これ以上管理フォルダを登録することはできません。");
				return;
			}

			/**
			 * 結局の所Wizardページ内では処理を行うフックがコンストラクタもしくは
			 * createControl()のみ、故にここでリスト取得をする他に手段がない。
			 */
			MessageDialog dlg = new MessageDialog(vmgr.getShell(), "タグ名の一覧取得", null, "データセンタからタグ名の一覧を取得しています。しばらくお待ちください...",
			  MessageDialog.INFORMATION, new String[] {}, 0);
			dlg.setBlockOnOpen(false);
			try {
				dlg.open();

				try {
					svnmgr.connect();
				}
				catch (ConnectionFailException ex) {
					logEventSource.fireEvent(new LogEvent(this, ex.getMessage(), LogEventType.ERROR, ex));
					vmgr.getDialogManager().createErrorMessageDialog(ex.getMessage());
					return;
				}

				try {
					list = svnmgr.getTagNames();
				}
				catch (InternalFailException ex) {
					logEventSource.fireEvent(new LogEvent(this, ex.getMessage(), LogEventType.ERROR, ex));
					vmgr.getDialogManager().createErrorMessageDialog(ex.getMessage());
					return;
				}
			}
			finally {
				dlg.close();
			}
			vmgr.getDialogManager().createTargetFolderWizard(list);
		}
		finally {
			taskmgr.start();
		}
	}
}
