/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.sis.feature;

import java.util.Set;
import java.util.Collection;
import java.util.Collections;
import java.io.Serializable;
import org.opengis.feature.Feature;
import org.opengis.feature.FeatureType;
import org.opengis.feature.PropertyType;
import org.opengis.feature.PropertyNotFoundException;
import org.opengis.feature.FeatureInstantiationException;
import org.opengis.util.GenericName;
import org.opengis.util.InternationalString;
import org.apache.sis.util.resources.Errors;


/**
 * A feature type identified only by its name. Instances of {@code NamedFeatureType} shall be used only as placeholder
 * while building a cyclic graphs of {@link DefaultFeatureType}. Instances of {@code NamedFeatureType} will be replaced
 * by instances of the actual feature type when the later become known.
 *
 * @author  Martin Desruisseaux (Geomatys)
 * @since   0.5
 * @version 0.6
 * @module
 */
final class NamedFeatureType implements FeatureType, Serializable {
    /**
     * For cross-version compatibility.
     */
    private static final long serialVersionUID = 178781891980017372L;

    /**
     * The name of the feature type for which this {@code NamedFeatureType} is a placeholder.
     */
    private final GenericName name;

    /**
     * Creates a new placeholder for a feature of the given name.
     */
    NamedFeatureType(final GenericName name) {
        this.name = name;
    }

    /**
     * Returns the name of this feature.
     */
    @Override
    public GenericName getName() {
        return name;
    }

    /** Undefined. */ @Override public InternationalString getDefinition()  {return null;}
    /** Undefined. */ @Override public InternationalString getDesignation() {return null;}
    /** Undefined. */ @Override public InternationalString getDescription() {return null;}

    /**
     * Declares that this feature shall not be instantiated.
     */
    @Override
    public boolean isAbstract() {
        return true;
    }

    /**
     * Conservatively assumes that the feature is not simple,
     * since we do not know what the actual feature will be.
     */
    @Override
    public boolean isSimple() {
        return false;
    }

    /**
     * Always throws {@link PropertyNotFoundException} since this feature type has no declared property yet.
     */
    @Override
    public PropertyType getProperty(final String name) throws PropertyNotFoundException {
        throw new PropertyNotFoundException(Errors.format(Errors.Keys.PropertyNotFound_2, getName(), name));
    }

    /**
     * Returns an empty set since this feature has no declared property yet.
     */
    @Override
    public Collection<? extends PropertyType> getProperties(final boolean includeSuperTypes) {
        return Collections.emptySet();
    }

    /**
     * Returns an empty set since this feature has no declared parent yet.
     */
    @Override
    public Set<? extends FeatureType> getSuperTypes() {
        return Collections.emptySet();
    }

    /**
     * This feature type is considered independent of all other feature types except itself.
     */
    @Override
    public boolean isAssignableFrom(final FeatureType type) {
        return (type instanceof NamedFeatureType);
    }

    /**
     * Unsupported operation, since the feature has not yet been resolved.
     */
    @Override
    public Feature newInstance() throws FeatureInstantiationException {
        throw new FeatureInstantiationException(Errors.format(Errors.Keys.UnresolvedFeatureName_1, getName()));
    }

    /**
     * Returns a string representation of this feature type.
     */
    @Override
    public String toString() {
        return "FeatureType[“" + name + "”]";
    }
}
