/**********************************************************************
 * Copyright (c) 2018 Ericsson
 *
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License 2.0 which
 * accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/
package org.eclipse.tracecompass.tmf.core.model.timegraph;

/**
 * Interface to get and set properties. This represents a group of items known
 * as properties. It provides a caching method for filtering elements, storing
 * the results as properties.
 * <p>
 * A developer should use this to store the results of tests to be able to
 * exchange these with another process that can act upon this "report".
 *
 * @author Jean-Christian Kouame
 * @since 4.0
 *
 */
public interface IPropertyCollection {

    /**
     * Get the item active properties value. Each bit of the value corresponds to a
     * item property. Available properties can be found at {@link IFilterProperty}.
     *
     * @return The properties value
     */
    default int getActiveProperties() {
        return 0;
    }

    /**
     * Set the active properties value. Each bit of the value corresponds to a item
     * property. Available properties can be found at {@link IFilterProperty}.
     *
     * @param activeProperties
     *            The active properties value
     */
    default void setActiveProperties(int activeProperties) {
        // Do nothing
    }

    /**
     * Activate/deactivate a property. The possible properties could be found in
     * {@link IFilterProperty}
     *
     * @param propertyMask
     *            The property key found in {@link IFilterProperty}
     * @param isActive
     *            The activation status of the property.
     */
    default void setProperty(int propertyMask, boolean isActive) {
        int activeProperties = getActiveProperties();
        if (isActive) {
            activeProperties |= propertyMask;
        } else {
            activeProperties &= ~propertyMask;
        }
        setActiveProperties(activeProperties);
    }

    /**
     * Get the active status of a specific property. The possible properties could
     * be found in {@link IFilterProperty}
     *
     * @param propertyMask
     *            The property key found in {@link IFilterProperty}
     * @return The property activation status false if not set
     */
    default boolean isPropertyActive(int propertyMask) {
        return (getActiveProperties() & propertyMask) != 0;
    }
}
