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 CheckOutAction extends ActionAdaptor {
	private final ViewManager vmgr;
	private final LocalSVNManager svnmgr = LocalSVNManager.getInstance();

	/**
	 * RegisterTargetAction
	 * @param vmgr
	 */
	public CheckOutAction(ViewManager vmgr) {
		setText("データセンタからホットショット・フォルダを作成(&C)");
		setToolTipText("データセンタからローカルPC上にホットショット・フォルダを作成します。");
		try {
			setImageDescriptor(ImageFactory.getInstance().getImageDescriptor("chkout"));
		}
		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();

			if (LocalModelManager.getInstance().canRegisterMore() == false) {
				vmgr.getDialogManager().createErrorMessageDialog(
				  "管理できるフォルダは最大で" + AppKeys.MAX_TARGETS + "となります。これ以上フォルダをチェックアウトすることはできません。");
				return;
			}

			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();
			}

			boolean bExist = false;
			LocalModelManager lmmgr = LocalModelManager.getInstance();
			for (int i = 0; i < list.size(); i++) {
				SVNRoot root = list.get(i);
				if (lmmgr.isExistTagnameInRocal(root.getName())) {
					continue;
				}
				bExist = true;
			}

			if (bExist == false) {
				sb.getLogger().info("データセンタにはチェックアウト可能なタグが存在していません。");
				vmgr.getDialogManager().createInformationMessageDialog("チェックアウトの確認", "データセンタにはチェックアウト可能なタグが存在していません。");
				return;
			}
			logEventSource.fireEvent(new LogEvent(this, LogEventType.CLEAR));

			vmgr.getDialogManager().createCheckoutWizard(list);
		}
		finally {
			sb.getLogger().debug(sb.gc()); // Gabage collection.
			taskmgr.start();
		}
	}
}
