/*******************************************************************************
 * Copyright (c) 2006, 2008 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.wizards;

import java.util.Collection;
import java.util.Collections;
import java.util.Map;

import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jpt.core.EntityGeneratorDatabaseAnnotationNameBuilder;
import org.eclipse.jpt.core.JpaProject;
import org.eclipse.jpt.db.Column;
import org.eclipse.jpt.db.ForeignKey;
import org.eclipse.jpt.db.Schema;
import org.eclipse.jpt.db.Table;
import org.eclipse.jpt.gen.internal.EntityGenerator;
import org.eclipse.jpt.gen.internal.PackageGenerator;
import org.eclipse.jpt.ui.internal.JptUiMessages;
import org.eclipse.jpt.utility.internal.CollectionTools;

/**
 * two pages:
 *   - a Database Schema page that allows the user to select a schema
 *   - a Generate Entities page that allows the user to select which tables in
 *     the selected schema are to be used and to configure Entity names
 */
public class GenerateEntitiesWizard extends Wizard {	

	private final JpaProject jpaProject;

	private final IStructuredSelection selection;

	private DatabaseSchemaWizardPage dbSchemaPage;
	
	private GenerateEntitiesWizardPage generateEntitiesPage;

	private final PackageGenerator.Config packageGeneratorConfig;

	private final EntityGenerator.Config entityGeneratorConfig;

	private boolean synchronizePersistenceXml;


	public GenerateEntitiesWizard(JpaProject jpaProject, IStructuredSelection selection) {
		super();
		this.jpaProject = jpaProject;
		this.selection = selection;
		this.packageGeneratorConfig = new PackageGenerator.Config();
		this.entityGeneratorConfig = new EntityGenerator.Config();
		this.setWindowTitle(JptUiMessages.GenerateEntitiesWizard_generateEntities);
	}

	@Override
	public void addPages() {
		super.addPages();
		this.dbSchemaPage = new DatabaseSchemaWizardPage(this.jpaProject);
		this.dbSchemaPage.addListener(new SchemaPageListener());
		this.addPage(this.dbSchemaPage);
		
		this.generateEntitiesPage = new GenerateEntitiesWizardPage();
		this.addPage(this.generateEntitiesPage);
		this.generateEntitiesPage.init(this.selection);
	}
	
	@Override
	public boolean canFinish() {
		return this.generateEntitiesPage.isPageComplete();
	}

	@Override
	public boolean performFinish() {
		this.packageGeneratorConfig.setPackageFragment(this.buildPackageFragment());

		this.entityGeneratorConfig.setConvertToJavaStyleIdentifiers(this.generateEntitiesPage.convertToJavaStyleIdentifiers());
		this.entityGeneratorConfig.setFieldAccessType(this.generateEntitiesPage.fieldAccessType());
		this.entityGeneratorConfig.setCollectionTypeName(this.generateEntitiesPage.getCollectionTypeName());
		this.entityGeneratorConfig.setCollectionAttributeNameSuffix(this.generateEntitiesPage.getCollectionAttributeNameSuffix());
		this.entityGeneratorConfig.setFieldVisibility(this.generateEntitiesPage.getFieldVisibility());
		this.entityGeneratorConfig.setMethodVisibility(this.generateEntitiesPage.getMethodVisibility());
		this.entityGeneratorConfig.setGenerateGettersAndSetters(this.generateEntitiesPage.generateGettersAndSetters());
		this.entityGeneratorConfig.setGenerateDefaultConstructor(this.generateEntitiesPage.generateDefaultConstructor());
		this.entityGeneratorConfig.setSerializable(this.generateEntitiesPage.serializable());
		this.entityGeneratorConfig.setGenerateSerialVersionUID(this.generateEntitiesPage.generateSerialVersionUID());
		this.entityGeneratorConfig.setGenerateEmbeddedIdForCompoundPK(this.generateEntitiesPage.generateEmbeddedIdForCompoundPK());
		this.entityGeneratorConfig.setEmbeddedIdAttributeName(this.generateEntitiesPage.getEmbeddedIdAttributeName());
		this.entityGeneratorConfig.setPrimaryKeyMemberClassName(this.generateEntitiesPage.getPrimaryKeyMemberClassName());
		for (Map.Entry<Table, String> entry : this.generateEntitiesPage.getSelectedTables().entrySet()) {
			this.entityGeneratorConfig.addTable(entry.getKey(), entry.getValue());
		}
		// the name builder comes from the JPA platform
		this.entityGeneratorConfig.setDatabaseAnnotationNameBuilder(this.buildDatabaseAnnotationNameBuilder());

		this.synchronizePersistenceXml = this.generateEntitiesPage.synchronizePersistenceXml();
		
		return true;
	}

	private EntityGenerator.DatabaseAnnotationNameBuilder buildDatabaseAnnotationNameBuilder() {
		return new LocalDatabaseAnnotationNameBuilder(this.jpaProject.getJpaPlatform().getEntityGeneratorDatabaseAnnotationNameBuilder());
	}

	private IPackageFragment buildPackageFragment() {
		IPackageFragmentRoot packageFragmentRoot = this.generateEntitiesPage.getPackageFragmentRoot();
		IPackageFragment packageFragment = this.generateEntitiesPage.getPackageFragment();
		
		if (packageFragment == null) {
			packageFragment= packageFragmentRoot.getPackageFragment(""); //$NON-NLS-1$
		}
		
		if (packageFragment.exists()) {
			return packageFragment;
		}

		try {
			return packageFragmentRoot.createPackageFragment(packageFragment.getElementName(), true, null);
		} 
		catch (JavaModelException ex) {
			throw new RuntimeException(ex);
		}
	}


	// ********** intra-wizard methods **********

	Collection<Table> getPossibleTables() {
		return this.buildTables(this.dbSchemaPage.getSelectedSchema());
	}

	JpaProject getJpaProject() {
		return this.jpaProject;
	}

	void selectedSchemaChanged(Schema schema) {
		this.generateEntitiesPage.setPossibleTables(this.buildTables(schema));
	}

	private Collection<Table> buildTables(Schema schema) {
		return (schema == null) ?
						Collections.<Table>emptySet()
					:
						CollectionTools.collection(schema.tables());
	}


	// ********** public methods - settings **********

	public PackageGenerator.Config getPackageGeneratorConfig() {
		return this.packageGeneratorConfig;
	}

	public EntityGenerator.Config getEntityGeneratorConfig() {
		return this.entityGeneratorConfig;
	}

	public boolean synchronizePersistenceXml(){
		return this.synchronizePersistenceXml;
	}


	// ********** name builder adapter **********

	/**
	 * adapt the JPA platform-supplied builder to the builder interface
	 * expected by the entity generator
	 */
	static class LocalDatabaseAnnotationNameBuilder implements EntityGenerator.DatabaseAnnotationNameBuilder {
		private EntityGeneratorDatabaseAnnotationNameBuilder builder;
		LocalDatabaseAnnotationNameBuilder(EntityGeneratorDatabaseAnnotationNameBuilder builder) {
			super();
			this.builder = builder;
		}
		public String buildTableAnnotationName(String entityName, Table table) {
			return this.builder.buildTableAnnotationName(entityName, table);
		}
		public String buildColumnAnnotationName(String attributeName, Column column) {
			return this.builder.buildColumnAnnotationName(attributeName, column);
		}
		public String buildJoinColumnAnnotationName(String attributeName, ForeignKey foreignKey) {
			return this.builder.buildJoinColumnAnnotationName(attributeName, foreignKey);
		}
		public String buildJoinColumnAnnotationName(Column column) {
			return this.builder.buildJoinColumnAnnotationName(column);
		}
		public String buildJoinTableAnnotationName(Table table) {
			return this.builder.buildJoinTableAnnotationName(table);
		}
	}


	// ********** schema page listener **********

	/**
	 * listen for when the Database Connection page changes its selected schema
	 * so we can keep the Generate Entities page in synch
	 */
	class SchemaPageListener implements DatabaseSchemaWizardPage.Listener {
		public void selectedSchemaChanged(Schema schema) {
			GenerateEntitiesWizard.this.selectedSchemaChanged(schema);
		}
	}
}
