/*
 * Copyright 2015 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.incubator.net.domain;

import com.google.common.annotations.Beta;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DeviceId;

import java.util.Set;

/**
 * Representation of an intent domain which includes the set of internal devices,
 * the set of edge ports, and the implementation of the domain provider.
 */
@Beta
public class IntentDomain {

    private final IntentDomainId id;
    private String name;

    private Set<DeviceId> internalDevices;
    private Set<ConnectPoint> edgePorts;

    private IntentDomainProvider provider;

    public IntentDomain(IntentDomainId id, String name,
                 Set<DeviceId> internalDevices,
                 Set<ConnectPoint> edgePorts) {
        this.id = id;
        this.name = name;
        this.internalDevices = internalDevices;
        this.edgePorts = edgePorts;
    }

    /**
     * Returns the id for the intent domain.
     *
     * @return intent domain id
     */
    public IntentDomainId id() {
        return id;
    }

    /**
     * Returns the friendly name for the intent domain.
     *
     * @return intent domain name
     */
    public String name() {
        return name;
    }

    /**
     * Returns the set of internal devices for the intent domain (devices under
     * exclusive control of the intent domain).
     *
     * @return set of internal devices
     */
    public Set<DeviceId> internalDevices() {
        return internalDevices;
    }

    /**
     * Returns the set of edge ports for the intent domain.
     *
     * @return set of edge ports
     */
    public Set<ConnectPoint> edgePorts() {
        return edgePorts;
    }

    /**
     * Returns the provider for the intent domain.
     *
     * @return intent domain provider
     */
    public IntentDomainProvider provider() {
        return provider;
    }

    /**
     * Returns the status of the intent domain. An intent domain is active if it
     * has an intent domain provider bound, and it is inactive if one is not bound.
     *
     * @return true if active; false otherwise
     */
    public boolean isActive() {
        return provider != null;
    }

    /**
     * Sets the provider for the intent domain if one is not already set.
     *
     * @param provider new intent domain provider
     */
    public void setProvider(IntentDomainProvider provider) {
        // TODO consider checkState depending on caller
        if (this.provider == null) {
            this.provider = provider;
        }
    }

    /**
     * Unsets the provider for the intent domain.
     */
    public void unsetProvider() {
        this.provider = null;
    }

    //TODO add remaining setters (we will probably want to link this to the network config)
}
