package com.logicaldoc.gui.frontend.client.document;

import java.util.LinkedHashMap;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.logicaldoc.gui.common.client.Session;
import com.logicaldoc.gui.common.client.beans.GUIDocument;
import com.logicaldoc.gui.common.client.beans.GUIFolder;
import com.logicaldoc.gui.common.client.i18n.I18N;
import com.logicaldoc.gui.common.client.log.Log;
import com.logicaldoc.gui.common.client.util.ItemFactory;
import com.logicaldoc.gui.common.client.util.Util;
import com.logicaldoc.gui.common.client.util.WindowUtils;
import com.logicaldoc.gui.common.client.widgets.ContactingServer;
import com.logicaldoc.gui.frontend.client.folder.FolderNavigator;
import com.logicaldoc.gui.frontend.client.panels.MainPanel;
import com.logicaldoc.gui.frontend.client.services.DocumentService;
import com.logicaldoc.gui.frontend.client.services.FolderService;
import com.smartgwt.client.types.HeaderControls;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
import com.smartgwt.client.widgets.form.fields.events.ClickHandler;

/**
 * This popup window is used to convert a document in different formats
 * 
 * @author Marco Meschieri - LogicalDOC
 * @since 7.6.4
 */
public class ConversionDialog extends Window {

	private GUIDocument document;

	private DynamicForm form = new DynamicForm();

	public ConversionDialog(GUIDocument document) {
		this.document = document;
		setHeaderControls(HeaderControls.HEADER_LABEL, HeaderControls.CLOSE_BUTTON);

		setTitle(I18N.message("convert") + " - " + document.getFileName());
		setCanDragResize(true);
		setIsModal(true);
		setShowModalMask(true);
		centerInPage();
		setAutoSize(true);

		final RadioGroupItem action = ItemFactory.newRadioGroup("action", I18N.message("action"));
		action.setRequired(true);
		action.setEndRow(true);

		final SelectItem format = ItemFactory.newConversionFormatItem(document.getFileName());
		format.setEndRow(true);
		format.setRequired(true);

		final ButtonItem convert = new ButtonItem();
		convert.setStartRow(false);
		convert.setTitle(I18N.message("convert"));
		convert.setAutoFit(true);
		convert.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				onConvert();
			}
		});

		FolderService.Instance.get().getFolder(document.getFolder().getId(), false, false, false, 
				new AsyncCallback<GUIFolder>() {

					@Override
					public void onFailure(Throwable caught) {
						Log.serverError(caught);
					}

					@Override
					public void onSuccess(GUIFolder folder) {
						convert.setDisabled(!folder.isDownload() && !folder.isWrite());

						LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
						if (folder.isDownload())
							map.put("download", I18N.message("download"));
						if (folder.isWrite())
							map.put("save", I18N.message("save"));
						action.setValueMap(map);
						action.setValue("download");

						form.setFields(format, action, convert);
						addItem(form);
					}
				});
	}

	public void onConvert() {
		if (!form.validate())
			return;

		String format = form.getValueAsString("format");

		ContactingServer.get().show();
		if ("save".equals(form.getValueAsString("action"))) {
			DocumentService.Instance.get().convert(document.getId(), document.getFileVersion(), format,
					new AsyncCallback<GUIDocument>() {

						@Override
						public void onFailure(Throwable caught) {
							ContactingServer.get().hide();
							Log.serverError(caught);
						}

						@Override
						public void onSuccess(GUIDocument doc) {
							ContactingServer.get().hide();
							if (MainPanel.get().isOnDocumentsTab())
								if (Session.get().getCurrentFolder() != null)
									FolderNavigator.get().selectFolder(Session.get().getCurrentFolder().getId());
							destroy();
						}
					});
		} else {
			WindowUtils.openUrl(Util.contextPath() + "convert?docId=" + document.getId() + "&fileVersion="
					+ document.getFileVersion() + "&format=" + format);
			ContactingServer.get().hide();
			destroy();
		}
	}
}