/*******************************************************************************
 * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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:
 *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
 ******************************************************************************/ 
package org.jboss.tools.common.model.ui.editors.dnd;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import org.jboss.tools.common.model.ui.editors.dnd.DropUtils.AttributeDescriptorValueProvider;
import org.jboss.tools.common.model.ui.editors.dnd.composite.TagAttributesComposite.AttributeDescriptorValue;

public class ExternalDropWizardModel extends DefaultDropWizardModel implements IDropWizardModel {

	public ExternalDropWizardModel(ITagProposalFactory tagProposalFactory) {
		super(tagProposalFactory);
	}

	/**
	 * @see org.jboss.tools.vpe.editor.dnd.IDnDWizardDataModel#getAttributeNameList()
	 */
	public List getAttributeNameList() {
		return new ArrayList();
	}
	
	/**
	 * @see org.jboss.tools.vpe.editor.dnd.IDnDWizardDataModel#getAttributeValue(java.lang.String)
	 */
	public String getAttributeValue(String name) {
		return null;
	}

	protected void doLoadTagAttributeDescriptors() {
		if(getTagProposal()!=UNDEFINED_TAG_PROPOSAL) {
			DropData data = getDropData();
			ITagProposal proposal = getTagProposal();
			AttributeDescriptorValueProvider valueProvider = data.getValueProvider();
			if(valueProvider != null) valueProvider.setProposal(proposal);
			AttributeDescriptorValue[] values = valueProvider == null ? new AttributeDescriptorValue[0]
			                                  : valueProvider.getValues();
				
			fAttributeValues = new ArrayList<AttributeDescriptorValue>(Arrays.asList(sort(values)));
		} else {
			fAttributeValues = new ArrayList<AttributeDescriptorValue>();
		}
	}
	
	/*
	 * Sorting AttributeDescriptorValue in below manner:
	 * - required atttributes
	 * - preferred attributes
	 * - all others filled
	 * - all others not filled
	 */
	private AttributeDescriptorValue[] sort(AttributeDescriptorValue[] elements) {
		Arrays.sort(
			elements, 
			new Comparator<AttributeDescriptorValue>() {
				public int compare(AttributeDescriptorValue arg0, AttributeDescriptorValue arg1) {

					AttributeDescriptorValue value1	= arg0;
					AttributeDescriptorValue value2	= arg1;

					if(value1.isRequired() && value2.isRequired()) {
						return value1.getName().compareTo(value2.getName());
					} else if(value1.isRequired()){
						return -1;
					} else if(value2.isRequired()){
						return 1;
					} else {
						if(value1.isPreferable() && value2.isPreferable()) {
							return value1.getName().compareTo(value2.getName());
						} else if(value1.isPreferable()){
							return -1;
						} else if(value2.isPreferable()){
							return 1;
						} else {
							return value1.getName().compareTo(value2.getName());
						}
					}
				}
			}
		);
		return elements;
	}	

}
