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

import java.util.ArrayList;

import org.eclipse.jface.dialogs.MessageDialog;

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

	/**
	 * RegisterTargetAction
	 * @param vmgr
	 */
	public LocalExportAction(ViewManager vmgr, String fileName) {
		setText("データの取り出し(&X)");
		setToolTipText("データセンタに格納されたデータを取り出します。");
		try {
			setImageDescriptor(ImageFactory.getInstance().getImageDescriptor("export"));
		}
		catch (Exception ex) {
			sb.getLogger().fatal("リソース設定のエラーが発生しました。", ex);
			System.exit(-1);
		}
		this.vmgr = vmgr;
		this.fileName = fileName;
	}

	/**
	 * run
	 */
	public void run() {
		TaskManager taskmgr = TaskManager.getInstance();
		ArrayList<ISVNFileItem> revlist = new ArrayList<ISVNFileItem>();

		try {
			taskmgr.stop();

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

			/**
			 * 結局の所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 {
					revlist = svnmgr.getRevisionInfo(fileName);
				}
				catch (InternalFailException ex) {
					logEventSource.fireEvent(new LogEvent(this, ex.getMessage(), LogEventType.ERROR, ex));
					vmgr.getDialogManager().createErrorMessageDialog(ex.getMessage());
					return;
				}
			}
			finally {
				dlg.close();
			}
			vmgr.getDialogManager().createLocalExportWizard(revlist);
		}
		finally {
			taskmgr.start();
		}
	}
}
