/*******************************************************************************
 * Copyright (c) 2003, 2016 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.releng.tools;

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.WizardPage;
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.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.List;
import org.eclipse.team.core.RepositoryProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;


public class MapProjectSelectionPage extends WizardPage {
	
	private MapProject selectedMapProject;
	private IDialogSettings settings;
	private ListViewer mapProjectListViewer;
	protected Button useDefaultProjectButton;
	protected boolean useDefaultMapProject;
	private final String SELECTED_PROJECT_KEY = "Selected Project"; //$NON-NLS-1$
	
	public MapProjectSelectionPage(String pageName, 
			String title, 
			IDialogSettings settings, 
			ImageDescriptor image) {
		super(pageName, title, image);
		this.settings = settings;
	}

	public void createControl(Composite parent) {
		Composite topContainer = new Composite(parent, SWT.NONE);
		topContainer.setLayout(new GridLayout());
		topContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
		
		mapProjectListViewer = createListViewer(topContainer); 
		mapProjectListViewer.setInput(getMapFileProjects());
		useDefaultProjectButton = new Button(topContainer, SWT.CHECK);
		useDefaultProjectButton.setText(Messages.getString("MapProjectSelectionPage.0")); //$NON-NLS-1$
		useDefaultProjectButton.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				useDefaultMapProject = (useDefaultProjectButton.getSelection());
				updateOthers();
			}
		});
	
        Dialog.applyDialogFont(parent);
        initializedViewer();
        setControl(topContainer);
	}

	protected ListViewer createListViewer(Composite parent) {
		List tree = new List(parent, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL);
		GridData gd= new GridData(GridData.FILL_BOTH);
		gd.heightHint= tree.getItemHeight() * 15;
		tree.setLayoutData(gd);
		ListViewer result = new ListViewer(tree);
		result.setContentProvider(new IStructuredContentProvider() {
			public Object[] getElements(Object inputElement) {
				Set<IProject> projects=(Set<IProject>)inputElement;
				return projects.toArray(new IProject[projects.size()]);
			}
			public void dispose() {	
			}
			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
			}
		});
		result.setLabelProvider(new WorkbenchLabelProvider());
		result.addSelectionChangedListener(event -> updateOthers());
		result.setComparator((new ResourceComparator(ResourceComparator.NAME)));
		return result;
	}	

	private static Set<IProject> getMapFileProjects() {
		Set<IProject> projects = new HashSet<IProject>();
		MapFile[] mapFiles;
		try {
			mapFiles = MapFile.findAllMapFiles(RelEngPlugin.getWorkspace().getRoot());
		} catch (CoreException ex) {
			return Collections.emptySet();
		}
		for (int i = 0; i < mapFiles.length; i++)
			projects.add(mapFiles[i].getFile().getProject());
		for (Iterator<IProject> iterator= projects.iterator(); iterator.hasNext();) {
			MapProject mapProject= null;
			try {
				mapProject= new MapProject(iterator.next());
				if (mapProject.getValidMapFiles().length == 0)
					iterator.remove();
			} catch (CoreException e) {
				iterator.remove();
			} finally {
				if (mapProject != null)
					mapProject.dispose();
			}
			
		}
		return projects;
	}

	private void updateMapProject(){
		if (selectedMapProject != null) {
			selectedMapProject.dispose();	
			selectedMapProject = null;
		}

		IStructuredSelection selection = (IStructuredSelection)mapProjectListViewer.getSelection();
		if( !selection.isEmpty()){
			Object obj = selection.getFirstElement();
			if(obj instanceof IProject){
				try {
					selectedMapProject = new MapProject((IProject)obj);
				} catch (CoreException e) {
					selectedMapProject = null;
				}
			}
		}
		setPageComplete(isValid(selectedMapProject));
	}

	/*
	 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
	 * @since 3.7
	 */
	@Override
	public void dispose() {
		if (selectedMapProject != null) {
			selectedMapProject.dispose();	
			selectedMapProject = null;
		}
		super.dispose();
	}

	private void initializedViewer(){
		readSettings();
		updateOthers();
	}
	
	protected void updateOthers(){
		updateMapProject();
	}
	
	private void readSettings(){
		String name = settings.get(SELECTED_PROJECT_KEY);
		if (name != null) {
			ISelection selection = new StructuredSelection(RelEngPlugin.getWorkspace().getRoot().getProject(name));
			mapProjectListViewer.setSelection(selection);
		}
		mapProjectListViewer.getList().setFocus();
	}
	
	public void saveSettings(){
		IStructuredSelection selection = (IStructuredSelection)mapProjectListViewer.getSelection();
		if(!selection.isEmpty()){
			Object obj = selection.getFirstElement();
			if(obj instanceof IProject){
				settings.put(SELECTED_PROJECT_KEY, ((IProject)obj).getName());			
			}
		}
	}
	
	private boolean isValid(final MapProject mapProject){
		//Check if map project is accessible
		if (mapProject==null || (!mapProject.getProject().isAccessible())){
			setErrorMessage(Messages.getString("MapProjectSelectionPage.1")); //$NON-NLS-1$
			return false;
		}

		//Check if the map project is shared
		if (RepositoryProvider.getProvider(mapProject.getProject()) == null){
			setErrorMessage(Messages.getString("MapProjectSelectionPage.2") + mapProject.getProject().getName()+Messages.getString("MapProjectSelectionPage.3"));	 //$NON-NLS-1$ //$NON-NLS-2$
			return false;
		}
		setErrorMessage(null);
		if (getWizard() instanceof ReleaseWizard)
			((ReleaseWizard)getWizard()).broadcastMapProjectChange(mapProject);
		return true;
	}
	
	//Used by MapProjectSelectionWizard for storing preferences
	protected MapProject getSelectedMapProject() {
		return selectedMapProject;
	}
	
	//Used by MapProjectSelectionWizard for storing preferences
	protected boolean useDefaultMapProject() {
		return useDefaultMapProject;
	}
}
