/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * Licensed 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.onosproject.yangutils.datamodel;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
import org.onosproject.yangutils.datamodel.utils.Parsable;
import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
import org.onosproject.yangutils.datamodel.utils.YangConstructType;

/*
 * Reference RFC 6020.
 *
 *  The "if-feature" statement makes its parent statement conditional.
 *  The argument is the name of a feature, as defined by a "feature"
 *  statement.  The parent statement is implemented by servers that
 *  support this feature.  If a prefix is present on the feature name, it
 *  refers to a feature defined in the module that was imported with that
 *  prefix, or the local module if the prefix matches the local module's
 *  prefix.  Otherwise, a feature with the matching name MUST be defined
 *  in the current module or an included submodule.
 *
 *  Since submodules cannot include the parent module, any features in
 *  the module that need to be exposed to submodules MUST be defined in a
 *  submodule.  Submodules can then include this submodule to find the
 *  definition of the feature.
 */

/**
 * Represents data model node to maintain information defined in YANG if-feature.
 */
public class YangIfFeature implements Parsable, Resolvable, Serializable {

    private static final long serialVersionUID = 806201635L;

    /**
     * if-feature argument.
     */
    YangNodeIdentifier name;

    /**
     * Referred feature information.
     */
    YangFeature referredFeature;

    /**
     * Referred feature parent information.
     */
    YangNode referredFeatureHolder;

    /**
     * Status of resolution. If completely resolved enum value is "RESOLVED",
     * if not enum value is "UNRESOLVED", in case reference of grouping/typedef
     * is added to uses/type but it's not resolved value of enum should be
     * "INTRA_FILE_RESOLVED".
     */
    private ResolvableStatus resolvableStatus;

    /**
     * Returns referred feature holder.
     *
     * @return referred feature holder
     */
    public YangNode getReferredFeatureHolder() {
        return referredFeatureHolder;
    }

    /**
     * Sets the referred feature holder.
     *
     * @param referredFeatureHolder referred feature holder
     */
    public void setReferredFeatureHolder(YangNode referredFeatureHolder) {
        this.referredFeatureHolder = referredFeatureHolder;
    }

    /**
     * Returns prefix associated with identifier.
     *
     * @return prefix associated with identifier
     */
    public String getPrefix() {
        return name.getPrefix();
    }

    /**
     * Sets prefix associated with identifier.
     *
     * @param prefix prefix associated with identifier
     */
    public void setPrefix(String prefix) {
        name.setPrefix(prefix);
    }

    /**
     * Returns referred feature associated with if-feature.
     *
     * @return referred feature associated with if-feature
     */
    public YangFeature getReferredFeature() {
        return referredFeature;
    }

    /**
     * Sets referred feature associated with if-feature.
     *
     * @param referredFeature referred feature associated with if-feature
     */
    public void setReferredFeature(YangFeature referredFeature) {
        this.referredFeature = referredFeature;
    }

    /**
     * Returns the YANG name of if-feature.
     *
     * @return the name of if-feature as defined in YANG file
     */
    public YangNodeIdentifier getName() {
        return name;
    }

    /**
     * Sets the YANG name of if-feature.
     *
     * @param name the name of if-feature as defined in YANG file
     */
    public void setName(YangNodeIdentifier name) {
        this.name = name;
    }

    @Override
    public YangConstructType getYangConstructType() {
        return YangConstructType.IF_FEATURE_DATA;
    }

    @Override
    public void validateDataOnEntry() throws DataModelException {
        // do nothing, no validation required for if-feature
    }

    @Override
    public void validateDataOnExit() throws DataModelException {
        // do nothing, no validation required for if-feature
    }

    @Override
    public ResolvableStatus getResolvableStatus() {
        return resolvableStatus;
    }

    @Override
    public void setResolvableStatus(ResolvableStatus resolvableStatus) {
        this.resolvableStatus = resolvableStatus;
    }

    @Override
    public void resolve() throws DataModelException {
        YangFeature feature = getReferredFeature();

        // check whether feature has if-feature
        List<YangIfFeature> ifFeatureList = feature.getIfFeatureList();
        if (ifFeatureList != null && !ifFeatureList.isEmpty()) {
            Iterator<YangIfFeature> ifFeatureIterator = ifFeatureList.iterator();
            while (ifFeatureIterator.hasNext()) {
                YangIfFeature ifFeature = ifFeatureIterator.next();
                if (ifFeature.getResolvableStatus() != ResolvableStatus.RESOLVED) {
                    setResolvableStatus(ResolvableStatus.INTRA_FILE_RESOLVED);
                    return;
                }
            }
        }
    }
}
