/*******************************************************************************
 * Copyright (c) 2007, 2011 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.ui.fix;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;

import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.StatusDialog;

import org.eclipse.jdt.ui.JavaUI;

import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
import org.eclipse.jdt.internal.ui.preferences.cleanup.CleanUpTabPage;
import org.eclipse.jdt.internal.ui.preferences.formatter.IModifyDialogTabPage;

public abstract class CleanUpSelectionDialog extends StatusDialog implements IModifyDialogTabPage.IModificationListener {

	protected final class NamedCleanUpTabPage {

		private final String fName;
		private final CleanUpTabPage fPage;

		public NamedCleanUpTabPage(String name, CleanUpTabPage page) {
			fName= name;
			fPage= page;
		}

		public CleanUpTabPage getPage() {
			return fPage;
		}

		public String getName() {
			return fName;
		}

	}

	private static final String DS_KEY_PREFERRED_WIDTH= ".preferred_width"; //$NON-NLS-1$
	private static final String DS_KEY_PREFERRED_HEIGHT= ".preferred_height"; //$NON-NLS-1$
	private static final String DS_KEY_PREFERRED_X= ".preferred_x"; //$NON-NLS-1$
	private static final String DS_KEY_PREFERRED_Y= ".preferred_y"; //$NON-NLS-1$
	private static final String DS_KEY_LAST_FOCUS= ".last_focus"; //$NON-NLS-1$

	private final Map<String, String> fWorkingValues;
	private final List<IModifyDialogTabPage> fTabPages;
	private final IDialogSettings fDialogSettings;
	private TabFolder fTabFolder;
	private CleanUpTabPage[] fPages;
	private Label fCountLabel;

	public CleanUpSelectionDialog(Shell parent, Map<String, String> settings, String title) {
		super(parent);
		setTitle(title);
		fWorkingValues= settings;
		setStatusLineAboveButtons(false);
		fTabPages= new ArrayList<>();
		fDialogSettings= JavaPlugin.getDefault().getDialogSettings();
	}

	/*
	 * @see org.eclipse.jface.dialogs.Dialog#isResizable()
	 * @since 3.4
	 */
	@Override
	protected boolean isResizable() {
		return true;
	}

	protected abstract NamedCleanUpTabPage[] createTabPages(Map<String, String> workingValues);

	protected abstract String getPreferenceKeyPrefix();

	protected abstract String getSelectionCountMessage(int selectionCount, int size);

	protected abstract String getEmptySelectionMessage();

	protected Map<String, String> getWorkingValues() {
		return fWorkingValues;
	}

	@Override
	public boolean close() {
		final Rectangle shell= getShell().getBounds();

		fDialogSettings.put(getPreferenceKeyWidth(), shell.width);
		fDialogSettings.put(getPreferenceKeyHeight(), shell.height);
		fDialogSettings.put(getPreferenceKeyPositionX(), shell.x);
		fDialogSettings.put(getPreferenceKeyPositionY(), shell.y);

		return super.close();
	}

	@Override
	public void create() {
		super.create();
		int lastFocusNr= 0;
		try {
			lastFocusNr= fDialogSettings.getInt(getPreferenceKeyFocus());
			if (lastFocusNr < 0)
				lastFocusNr= 0;
			if (lastFocusNr > fTabPages.size() - 1)
				lastFocusNr= fTabPages.size() - 1;
		} catch (NumberFormatException x) {
			lastFocusNr= 0;
		}

		fTabFolder.setSelection(lastFocusNr);
		((IModifyDialogTabPage) fTabFolder.getSelection()[0].getData()).setInitialFocus();
	}

	@Override
	protected Control createDialogArea(Composite parent) {
		final Composite composite= (Composite) super.createDialogArea(parent);

		fTabFolder= new TabFolder(composite, SWT.NONE);
		fTabFolder.setFont(composite.getFont());
		fTabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

		NamedCleanUpTabPage[] pages= createTabPages(fWorkingValues);

		fPages= new CleanUpTabPage[pages.length];

		for (int i= 0; i < pages.length; i++) {
			fPages[i]= pages[i].getPage();
			addTabPage(pages[i].getName(), fPages[i]);
		}

		fCountLabel= new Label(composite, SWT.NONE);
		fCountLabel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
		updateCountLabel();

		applyDialogFont(composite);

		fTabFolder.addSelectionListener(new SelectionListener() {
			@Override
			public void widgetDefaultSelected(SelectionEvent e) {
			}

			@Override
			public void widgetSelected(SelectionEvent e) {
				final TabItem tabItem= (TabItem) e.item;
				final IModifyDialogTabPage page= (IModifyDialogTabPage) tabItem.getData();
				fDialogSettings.put(getPreferenceKeyFocus(), fTabPages.indexOf(page));
				page.makeVisible();
			}
		});

		updateStatus(StatusInfo.OK_STATUS);

		return composite;
	}

	@Override
	public void updateStatus(IStatus status) {
		int count= 0;
		for (CleanUpTabPage page : fPages) {
			count+= page.getSelectedCleanUpCount();
		}
		if (count == 0) {
			super.updateStatus(new Status(IStatus.ERROR, JavaUI.ID_PLUGIN, getEmptySelectionMessage()));
		} else {
			if (status == null) {
				super.updateStatus(StatusInfo.OK_STATUS);
			} else {
				super.updateStatus(status);
			}
		}
	}

	@Override
	protected Point getInitialSize() {
		Point initialSize= super.getInitialSize();
		try {
			int lastWidth= fDialogSettings.getInt(getPreferenceKeyWidth());
			if (initialSize.x > lastWidth)
				lastWidth= initialSize.x;
			int lastHeight= fDialogSettings.getInt(getPreferenceKeyHeight());
			if (initialSize.y > lastHeight)
				lastHeight= initialSize.y;
			return new Point(lastWidth, lastHeight);
		} catch (NumberFormatException ex) {
		}
		return initialSize;
	}

	@Override
	protected Point getInitialLocation(Point initialSize) {
		try {
			return new Point(fDialogSettings.getInt(getPreferenceKeyPositionX()), fDialogSettings.getInt(getPreferenceKeyPositionY()));
		} catch (NumberFormatException ex) {
			return super.getInitialLocation(initialSize);
		}
	}

	private final void addTabPage(String title, IModifyDialogTabPage tabPage) {
		final TabItem tabItem= new TabItem(fTabFolder, SWT.NONE);
		applyDialogFont(tabItem.getControl());
		tabItem.setText(title);
		tabItem.setData(tabPage);
		tabItem.setControl(tabPage.createContents(fTabFolder));
		fTabPages.add(tabPage);
	}

	@Override
	public void valuesModified() {
		updateCountLabel();
		updateStatus(StatusInfo.OK_STATUS);
	}

	private void updateCountLabel() {
		int size= 0, count= 0;
		for (CleanUpTabPage page : fPages) {
			size+= page.getCleanUpCount();
			count+= page.getSelectedCleanUpCount();
		}

		fCountLabel.setText(getSelectionCountMessage(count, size));
	}

	private String getPreferenceKeyWidth() {
		return getPreferenceKeyPrefix() + DS_KEY_PREFERRED_WIDTH;
	}

	private String getPreferenceKeyHeight() {
		return getPreferenceKeyPrefix() + DS_KEY_PREFERRED_HEIGHT;
	}

	private String getPreferenceKeyPositionY() {
		return getPreferenceKeyPrefix() + DS_KEY_PREFERRED_Y;
	}

	private String getPreferenceKeyFocus() {
		return getPreferenceKeyPrefix() + DS_KEY_LAST_FOCUS;
	}

	private String getPreferenceKeyPositionX() {
		return getPreferenceKeyPrefix() + DS_KEY_PREFERRED_X;
	}

}