/*
 * 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.net.resource;

import com.google.common.annotations.Beta;
import com.google.common.collect.ImmutableSet;

import java.util.Objects;
import java.util.Optional;
import java.util.Set;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;

/**
 * Represents a set of discrete type resources.
 * This class is intended to be used by ConsistentResourceStore though it is exposed to the public.
 */
@Beta
public final class DiscreteResourceSet {
    private final Set<DiscreteResource> values;
    private final DiscreteResourceCodec codec;

    private static final DiscreteResourceSet EMPTY = new DiscreteResourceSet(ImmutableSet.of(), NoOpCodec.INSTANCE);

    /**
     * Creates an instance with resources and the codec for them.
     *
     * @param values resources to be contained in the instance
     * @param codec codec for the specified resources
     * @return an instance
     */
    public static DiscreteResourceSet of(Set<DiscreteResource> values, DiscreteResourceCodec codec) {
        checkNotNull(values);
        checkNotNull(codec);
        checkArgument(!values.isEmpty());

        return new DiscreteResourceSet(ImmutableSet.copyOf(values), codec);
    }

    /**
     * Creates the instance representing an empty resource set.
     *
     * @return an empty resource set
     */
    public static DiscreteResourceSet empty() {
        return EMPTY;
    }

    private DiscreteResourceSet(Set<DiscreteResource> values, DiscreteResourceCodec codec) {
        this.values = values;
        this.codec = codec;
    }

    private DiscreteResourceSet() {
        this.values = null;
        this.codec = null;
    }

    /**
     * Returns resources contained in this instance.
     *
     * @return resources
     */
    public Set<DiscreteResource> values() {
        return values;
    }

    /**
     * Returns the parent resource of the resources contained in this instance.
     *
     * @return the parent resource of the resources
     */
    public DiscreteResourceId parent() {
        if (values.isEmpty()) {
            // Dummy value avoiding null
            return ResourceId.ROOT;
        }
        Optional<DiscreteResourceId> parent = values.iterator().next().id().parent();
        checkState(parent.isPresent());

        return parent.get();
    }

    /**
     * Returns the codec for the resources contained in this instance.
     *
     * @return the codec for the resources
     */
    public DiscreteResourceCodec codec() {
        return codec;
    }

    @Override
    public int hashCode() {
        return Objects.hash(values, codec);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }

        final DiscreteResourceSet other = (DiscreteResourceSet) obj;
        return Objects.equals(this.values, other.values)
                && Objects.equals(this.codec, other.codec);
    }

    public boolean contains(DiscreteResource resource) {
        return values.contains(resource);
    }
}
