/*******************************************************************************
 * Copyright (c) 2016 Ericsson AB.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Ericsson - initial API and implementation
 *******************************************************************************/

package org.eclipse.egerrit.internal.ui.table.provider;

import java.util.ArrayList;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.Observables;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.egerrit.internal.core.GerritClient;
import org.eclipse.egerrit.internal.model.ChangeInfo;
import org.eclipse.egerrit.internal.model.ModelPackage;
import org.eclipse.egerrit.internal.model.RevisionInfo;
import org.eclipse.egerrit.internal.ui.tabs.ObservableCollector;
import org.eclipse.egerrit.internal.ui.utils.DataConverter;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.databinding.FeaturePath;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;

/**
 * This class handle the user selection of a patch set
 */
public class PatchSetHandlerProvider {

	private ChangeInfo fChangeInfo;

	private GerritClient fGerritClient;

	private Label patchsetlabel;

	private DataBindingContext bindingContext = new DataBindingContext();

	private ObservableCollector observableCollector;

	/**
	 * Create a button and add all handling for this patchset selection button
	 *
	 * @param parent
	 * @param changeInfo
	 * @param fGerritClient
	 * @return Button
	 */
	public Button create(Composite parent, ChangeInfo changeInfo, GerritClient gerritClient) {
		this.fChangeInfo = changeInfo;
		this.fGerritClient = gerritClient;
		patchsetlabel = new Label(parent, SWT.NONE);

		Button fButtonPatchSet = new Button(parent, SWT.DROP_DOWN | SWT.ARROW | SWT.DOWN);
		fButtonPatchSet.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
		fButtonPatchSet.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				MenuManager mgr = new MenuManager();
				fillMenuItemForChangeInfo(mgr);
				mgr.createContextMenu(parent).setVisible(true);
			}
		});
		patchsetSelectionBinding();
		return fButtonPatchSet;
	}

	private void fillMenuItemForChangeInfo(MenuManager menu) {
		ArrayList<RevisionInfo> revisions = new ArrayList<>(fChangeInfo.getRevisions().values());
		revisions.sort((o1, o2) -> o2.get_number() - o1.get_number());
		revisions.stream().forEach(rev -> menu.add(new SwitchCurrentPathsetAction(fChangeInfo, rev)));
	}

	/**
	 * Add binding to this patch set button
	 */
	private void patchsetSelectionBinding() {
		FeaturePath selectRevision = FeaturePath.fromList(ModelPackage.Literals.CHANGE_INFO__USER_SELECTED_REVISION);
		IObservableValue observerValue = EMFProperties.value(selectRevision).observe(fChangeInfo);

		bindingContext.bindValue(Observables.observeDelayedValue(1000, WidgetProperties.text().observe(patchsetlabel)),
				Observables.observeDelayedValue(1000, observerValue), null,
				new UpdateValueStrategy().setConverter(DataConverter.patchSetSelected(fChangeInfo, fGerritClient)));

		//See when a REBASE occurs, the current revision is updated
		IObservableValue observerRevisionsValue = EMFProperties
				.value(ModelPackage.Literals.CHANGE_INFO__CURRENT_REVISION).observe(fChangeInfo);

		bindingContext.bindValue(WidgetProperties.text().observe(patchsetlabel), observerRevisionsValue, null,
				new UpdateValueStrategy().setConverter(DataConverter.patchSetSelected(fChangeInfo, fGerritClient)));
		observableCollector = new ObservableCollector(bindingContext);
	}

	public void dispose() {
		observableCollector.dispose();
		bindingContext.dispose();
	}
}
