/*******************************************************************************
 * Copyright (c) 2001, 2008 Oracle 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:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.itemcreation;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jst.jsf.common.dom.TagIdentifier;
import org.eclipse.jst.jsf.common.metadata.Entity;
import org.eclipse.jst.jsf.common.metadata.Model;
import org.eclipse.jst.jsf.common.metadata.Trait;
import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
import org.eclipse.jst.pagedesigner.utils.JSPUtil;
import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;

/**
 * Value object that wraps creation data
 *  
 * <p><b>Provisional API - subject to change</b></p>
 *  
 * @author cbateman
 *
 */
public final class CreationData
{
    private final ITagDropSourceData  _creationProvider;
    private final String                _prefix; 
    private final IDOMPosition          _domPosition;
    private final IDOMModel             _model;
    private final IAdaptable            _customizationData;

    private TagIdentifier               _tagId; // = null; lazy init on creation 
    
    /**
     * The tag {@link Entity} being created
     */
    private Entity _tagEntity; // = null; lazy load because derived from
                               // potentially expensive meta-data search
    
    /**
     * The {@link ITaglibDomainMetaDataModelContext} for the tag creation
     */
    private final ITaglibDomainMetaDataModelContext _taglibMetaDataContext;

    // mutable because it may be changed from the original _domPosition
    private IDOMPosition _adjustedPosition;

    
    /**
     * @param creationProvider 
     * @param model 
     * @param domPosition 
     * @param taglibMetaDataContext 
     * @param customizationData 
     */
    public CreationData(final ITagDropSourceData creationProvider,
            final IDOMModel model, final IDOMPosition domPosition,
            final ITaglibDomainMetaDataModelContext taglibMetaDataContext,
            final IAdaptable customizationData)
    {
        super();
        this._creationProvider = creationProvider;
        this._prefix = getPrefix(getUri(), model, getDefaultPrefix());
        this._taglibMetaDataContext = taglibMetaDataContext;
        this._domPosition = domPosition;
        this._adjustedPosition = _domPosition;
        this._model = model;
        this._customizationData = customizationData; 
    }

    /**
     * Returns the ns prefix for the tag and also creates taglib reference if necessary
     * @param uri
     * @param model
     * @param suggested
     * @return prefix to use
     */
    protected static String getPrefix(String uri, IDOMModel model,
            String suggested) {
        // TODO: this shouldn't really add to the document
        if (uri==null || ITLDConstants.URI_HTML.equalsIgnoreCase(uri)
                || ITLDConstants.URI_JSP.equalsIgnoreCase(uri)
                || CMDocType.JSP11_DOC_TYPE.equalsIgnoreCase(uri)) {
            return null;
        }

        // now handles custom tag lib
        return JSPUtil.getOrCreatePrefix(model, uri, suggested);
    }
    
    /**
     * @return the tag identifier uri
     */
    public String getUri() {
        return _creationProvider.getNamespace();
    }

    /**
     * @return the default prefix
     */
    public String getDefaultPrefix() {
        return _creationProvider.getDefaultPrefix();
    }

    /**
     * @return the local prefix for the  tag
     */
    public String getPrefix() {
        return _prefix;
    }

    /**
     * @return the tag name
     */
    public String getTagName() {
        return _creationProvider.getTagName();
    }

    /**
     * @return the creation provider
     */
    public ITagDropSourceData getTagCreationProvider()
    {
        return _creationProvider;
    }

    /**
     * @return the {@link Entity} for this tag element being created
     */
    public Entity getTagEntity() {
        if (_tagEntity == null){
            _tagEntity = TaglibDomainMetaDataQueryHelper.getEntity(_taglibMetaDataContext, getTagName());
            
        }
        return _tagEntity;
    }
    
    /**
     * @return flag indicating that html form container ancestor is required
     */
    public boolean isHTMLFormRequired() {
        Trait t = TaglibDomainMetaDataQueryHelper.getTrait(getTagEntity(), "requires-html-form"); //$NON-NLS-1$
        if (t != null)
            return TraitValueHelper.getValueAsBoolean(t);
        
        return false;
    }
    
    /**
     * @return flag indicating that jsf component
     */
    public boolean isJSFComponent() {      
        Model model = TaglibDomainMetaDataQueryHelper.getModel(_taglibMetaDataContext);
        Trait t = TaglibDomainMetaDataQueryHelper.getTrait(model, "is-jsf-component-library"); //$NON-NLS-1$
        if (t != null)
            return TraitValueHelper.getValueAsBoolean(t);
        
        return false;
    }

    /**
     * @return the metadata context for the tag
     */
    public ITaglibDomainMetaDataModelContext getTaglibMetaDataContext() {
        return _taglibMetaDataContext;
    }

    /**
     * @return the original dom position of the tag creation
     */
    public IDOMPosition getDomPosition() {
        return _domPosition;
    }

    /**
     * @return the dom model
     */
    public IDOMModel getModel() 
    {
        return _model;
    }

    /**
     * @return the adjusted position (calculated to account for containers etc.)
     */
    public IDOMPosition getAdjustedPosition() {
        return _adjustedPosition;
    }

    /**
     * @param adjustedPosition
     */
    /*package*/ void setAdjustedPosition(IDOMPosition adjustedPosition) {
        _adjustedPosition = adjustedPosition;
    }

    /**
     * @return the TagIdentifer for the tag to be created
     */
    public TagIdentifier getTagId() 
    {
        if (_tagId == null)
        {
            _tagId = TagIdentifierFactory.createJSPTagWrapper(getUri(), getTagName());
        }
        return _tagId;
    }

    /**
     * @return the customization data passed in from the tool.  May be null.
     */
    public IAdaptable getDropCustomizationData() {
        return _customizationData;
    }
}