/*******************************************************************************
 * Copyright (c) 2006, 2007 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.ui.internal.mappings.details;

import java.util.Iterator;
import org.eclipse.emf.common.command.CommandStack;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jpt.core.internal.mappings.IEntity;
import org.eclipse.jpt.core.internal.mappings.ISecondaryTable;
import org.eclipse.jpt.core.internal.mappings.ITable;
import org.eclipse.jpt.core.internal.mappings.JpaCoreMappingsPackage;
import org.eclipse.jpt.ui.internal.details.BaseJpaComposite;
import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Display;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;

//TODO handle xml, how to handle virtual secondaryTables, adding them to xml, are they overriden, etc??
public class SecondaryTablesComposite extends BaseJpaComposite 
{
	private IEntity entity;
	private final Adapter entityListener;
	private final Adapter secondaryTableListener;
	
	ListViewer secondaryTablesListViewer;

	private Button addButton;
	private Button editButton;
	private Button removeButton;
	
	private PrimaryKeyJoinColumnsInSecondaryTableComposite pkJoinColumnsComposite;
	
	public SecondaryTablesComposite(Composite parent, CommandStack commandStack, TabbedPropertySheetWidgetFactory widgetFactory) {
		super(parent, SWT.NULL, commandStack, widgetFactory);
		this.entityListener = buildEntityListener();
		this.secondaryTableListener = buildSecondaryTableListener();
	}
	
	private Adapter buildEntityListener() {
		return new AdapterImpl() {
			public void notifyChanged(Notification notification) {
				entityChanged(notification);
			}
		};
	}
	
	private Adapter buildSecondaryTableListener() {
		return new AdapterImpl() {
			public void notifyChanged(Notification notification) {
				seoncaryTableChanged(notification);
			}
		};
	}
	
	@Override
	protected void initializeLayout(Composite composite) {
		GridLayout layout = new GridLayout(2, false);
		layout.marginWidth = 0;
		composite.setLayout(layout);
		
		GridData gridData =  new GridData();
		
		Composite secondaryTablesComposite = new Composite(composite, SWT.NONE);
		layout = new GridLayout(3, false);
		layout.marginWidth = 0;
		secondaryTablesComposite.setLayout(layout);
		gridData =  new GridData();
		gridData.horizontalAlignment = GridData.FILL;
		gridData.verticalAlignment = GridData.FILL;
		gridData.grabExcessHorizontalSpace = true;
		gridData.grabExcessVerticalSpace = true;
		secondaryTablesComposite.setLayoutData(gridData);
	
		this.secondaryTablesListViewer = buildSecondaryTablesListViewer(secondaryTablesComposite);
		gridData =  new GridData();
		gridData.horizontalAlignment = GridData.FILL;
		gridData.verticalAlignment = GridData.FILL;
		gridData.horizontalSpan = 3;
		gridData.grabExcessHorizontalSpace = true;
		gridData.grabExcessVerticalSpace = true;
		this.secondaryTablesListViewer.getList().setLayoutData(gridData);
		//PlatformUI.getWorkbench().getHelpSystem().setHelp(this.secondaryTablesListViewer.getList(), IJpaHelpContextIds.MAPPING_JOIN_TABLE_COLUMNS);
		
		Composite buttonsComposite = new Composite(secondaryTablesComposite, SWT.NONE);
		layout = new GridLayout(3, false);
		layout.marginWidth = 0;
		buttonsComposite.setLayout(layout);
		gridData =  new GridData();
		gridData.horizontalAlignment = SWT.END;
		buttonsComposite.setLayoutData(gridData);
		
		this.addButton = getWidgetFactory().createButton(
			buttonsComposite, 
			JptUiMappingsMessages.SecondaryTablesComposite_add, 
			SWT.NONE);
		gridData =  new GridData();
		gridData.horizontalAlignment = GridData.FILL;
		this.addButton.setLayoutData(gridData);
		this.addButton.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
				// do nothing
			}
		
			public void widgetSelected(SelectionEvent e) {
				addSecondaryTable();
			}
		});
		
		this.editButton = getWidgetFactory().createButton(
			buttonsComposite, 
			JptUiMappingsMessages.SecondaryTablesComposite_edit, 
			SWT.NONE);
		gridData =  new GridData();
		gridData.horizontalAlignment = GridData.FILL;
		this.editButton.setLayoutData(gridData);
		this.editButton.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
				// do nothing
			}
		
			public void widgetSelected(SelectionEvent e) {
				editSecondaryTable();
			}
		});

		this.removeButton = getWidgetFactory().createButton(
			buttonsComposite, 
			JptUiMappingsMessages.SecondaryTablesComposite_remove, 
			SWT.NONE);
		gridData =  new GridData();
		gridData.horizontalAlignment = GridData.FILL;
		gridData.verticalAlignment = GridData.BEGINNING;
		this.removeButton.setLayoutData(gridData);
		this.removeButton.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
				// do nothing
			}
		
			public void widgetSelected(SelectionEvent e) {
				removeSecondaryTable();
			}
		});
		
		this.pkJoinColumnsComposite = new PrimaryKeyJoinColumnsInSecondaryTableComposite(composite, this.commandStack, getWidgetFactory());
		gridData =  new GridData();
		gridData.horizontalAlignment = GridData.FILL;
		gridData.verticalAlignment = GridData.FILL;
		gridData.grabExcessHorizontalSpace = true;
		gridData.grabExcessVerticalSpace = true;
		this.pkJoinColumnsComposite.getControl().setLayoutData(gridData);
	}
	
	private ListViewer buildSecondaryTablesListViewer(Composite parent) {
		ListViewer listViewer = new ListViewer(parent, SWT.SINGLE | SWT.BORDER);
		listViewer.setLabelProvider(buildSecondaryTablesListLabelProvider());
		listViewer.setContentProvider(buildSecondaryTablesListContentProvider());
		
		listViewer.addSelectionChangedListener(new ISelectionChangedListener() {
			public void selectionChanged(SelectionChangedEvent event) {
				updateEnablement();
				secondaryTablesListSelectionChanged(event);
			}
		});

		return listViewer;
	}
	
	protected void secondaryTablesListSelectionChanged(SelectionChangedEvent event) {
		if (((StructuredSelection) event.getSelection()).isEmpty()) {
			this.pkJoinColumnsComposite.populate(null);
			this.pkJoinColumnsComposite.enableWidgets(false);
		}
		else {
			ISecondaryTable selectedSecondaryTable = getSelectedSecondaryTable();
			this.pkJoinColumnsComposite.populate(selectedSecondaryTable);
			this.pkJoinColumnsComposite.enableWidgets(true);
		}
	}

	private IContentProvider buildSecondaryTablesListContentProvider() {
		return new IStructuredContentProvider(){
			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
				// do nothing
			}
		
			public void dispose() {
				// do nothing
			}
		
			public Object[] getElements(Object inputElement) {
				return ((IEntity) inputElement).getSecondaryTables().toArray();
			}
		};
	}
	
	private ILabelProvider buildSecondaryTablesListLabelProvider() {
		return new LabelProvider() {
			public String getText(Object element) {
				//TODO display a qualified name instead
				ISecondaryTable secondaryTable = (ISecondaryTable) element;
				return secondaryTable.getName();
			}
		};
	}
	
	void addSecondaryTable() {
		SecondaryTableDialog dialog = new SecondaryTableDialog(this.getControl().getShell(), this.entity);
		addSecondaryTableFromDialog(dialog);
	}
	
	private void addSecondaryTableFromDialog(SecondaryTableDialog dialog) {
		if (dialog.open() == Window.OK) {
			int index = this.entity.getSpecifiedSecondaryTables().size();
			String name = dialog.getSelectedName();
			String catalog = dialog.getSelectedCatalog();
			String schema = dialog.getSelectedSchema();
			ISecondaryTable secondaryTable = this.entity.createSecondaryTable(index);
			this.entity.getSpecifiedSecondaryTables().add(secondaryTable);
			secondaryTable.setSpecifiedName(name);
			secondaryTable.setSpecifiedCatalog(catalog);
			secondaryTable.setSpecifiedSchema(schema);
			
			this.secondaryTablesListViewer.setSelection(new StructuredSelection(secondaryTable));
		}
	}
	
	void editSecondaryTable() {
		ISecondaryTable secondaryTable = getSelectedSecondaryTable();
		SecondaryTableDialog dialog = new SecondaryTableDialog(this.getControl().getShell(), secondaryTable, this.entity);
		editSecondaryTableFromDialog(dialog, secondaryTable);
	}
	
	private void editSecondaryTableFromDialog(SecondaryTableDialog dialog, ISecondaryTable secondaryTable) {
		if (dialog.open() == Window.OK) {
			editSecondaryTableDialogOkd(dialog, secondaryTable);
		}
	}
	
	private void editSecondaryTableDialogOkd(SecondaryTableDialog dialog, ISecondaryTable secondaryTable) {
		String name = dialog.getSelectedName();
		String catalog = dialog.getSelectedCatalog();
		String schema = dialog.getSelectedSchema();

		if (secondaryTable.getSpecifiedName() == null || !secondaryTable.getSpecifiedName().equals(name)){
			secondaryTable.setSpecifiedName(name);
		}
		
		if (dialog.isDefaultCatalogSelected()) {
			if (secondaryTable.getSpecifiedCatalog() != null) {
				secondaryTable.setSpecifiedCatalog(null);
			}
		}
		else if (secondaryTable.getSpecifiedCatalog() == null || !secondaryTable.getSpecifiedCatalog().equals(catalog)){
			secondaryTable.setSpecifiedCatalog(catalog);
		}
		
		if (dialog.isDefaultSchemaSelected()) {
			if (secondaryTable.getSpecifiedSchema() != null) {
				secondaryTable.setSpecifiedSchema(null);
			}
		}
		else if (secondaryTable.getSpecifiedSchema() == null || !secondaryTable.getSpecifiedSchema().equals(schema)){
			secondaryTable.setSpecifiedSchema(schema);
		}
	}

	private ISecondaryTable getSelectedSecondaryTable() {
		return (ISecondaryTable) ((StructuredSelection) this.secondaryTablesListViewer.getSelection()).getFirstElement();
	}

	
	void removeSecondaryTable() {
		ISelection selection = this.secondaryTablesListViewer.getSelection();
		if (selection instanceof StructuredSelection) {
			for (Iterator<ISecondaryTable> i = ((StructuredSelection) selection).iterator(); i.hasNext(); ) {
				this.entity.getSpecifiedSecondaryTables().remove(i.next());
			}
		}
	}
	
	void updateEnablement() {
		this.editButton.setEnabled(!((StructuredSelection) this.secondaryTablesListViewer.getSelection()).isEmpty());
		this.removeButton.setEnabled(!((StructuredSelection) this.secondaryTablesListViewer.getSelection()).isEmpty());
	}	
	
	public void doPopulate(EObject obj) {
		this.entity = (IEntity) obj;
		if (this.entity == null) {
			this.secondaryTablesListViewer.setInput(null);
			return;
		}
		
		this.secondaryTablesListViewer.setInput(this.entity);
		if (!this.entity.getSecondaryTables().isEmpty()) {
			this.secondaryTablesListViewer.setSelection(new StructuredSelection(this.entity.getSecondaryTables().get(0)));
		}
		else {
			this.secondaryTablesListViewer.setSelection(null);			
		}
		updateEnablement();
	}

	@Override
	protected void doPopulate() {
	}

	protected void engageListeners() {
		if (this.entity != null) {
			this.entity.eAdapters().add(this.entityListener);
			for (ISecondaryTable secondaryTable : this.entity.getSecondaryTables()) {
				secondaryTable.eAdapters().add(this.secondaryTableListener);
			}	
		}
	}
	
	protected void disengageListeners() {
		if (this.entity != null) {
			for (ISecondaryTable secondaryTable : this.entity.getSecondaryTables()) {
				secondaryTable.eAdapters().remove(this.secondaryTableListener);
			}
			this.entity.eAdapters().remove(this.entityListener);
		}
	}
	
	protected void entityChanged(Notification notification) {
		if (notification.getFeatureID(IEntity.class) == JpaCoreMappingsPackage.IENTITY__SPECIFIED_SECONDARY_TABLES) {
			if (notification.getEventType() == Notification.ADD) {
				((ISecondaryTable) notification.getNewValue()).eAdapters().add(this.secondaryTableListener);
			}
			else if (notification.getEventType() == Notification.REMOVE) {
				((ISecondaryTable) notification.getOldValue()).eAdapters().remove(this.secondaryTableListener);				
			}
			Display.getDefault().asyncExec(new Runnable() {
				public void run() {
					if (getControl().isDisposed()) {
						return;
					}
					secondaryTablesListViewer.refresh();
					updateEnablement();
				}
			});
		}
	}

	protected void seoncaryTableChanged(Notification notification) {
		if (notification.getFeatureID(ITable.class) == JpaCoreMappingsPackage.ITABLE__SPECIFIED_NAME
			|| notification.getFeatureID(ITable.class) == JpaCoreMappingsPackage.ITABLE__SPECIFIED_CATALOG
			|| notification.getFeatureID(ITable.class) == JpaCoreMappingsPackage.ITABLE__SPECIFIED_SCHEMA
			|| notification.getFeatureID(ITable.class) == JpaCoreMappingsPackage.ITABLE__DEFAULT_CATALOG
			|| notification.getFeatureID(ITable.class) == JpaCoreMappingsPackage.ITABLE__DEFAULT_SCHEMA) {
			Display.getDefault().asyncExec(new Runnable() {
				public void run() {
					if (getControl().isDisposed()) {
						return;
					}
					secondaryTablesListViewer.refresh();
				}
			});
		}
	}
}
