/*
 * 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.incubator.net.virtual.impl;

import com.google.common.collect.Iterators;
import org.onosproject.incubator.net.virtual.NetworkId;
import org.onosproject.incubator.net.virtual.VirtualNetworkIntent;
import org.onosproject.incubator.net.virtual.VirtualNetworkService;
import org.onosproject.incubator.net.virtual.VirtualNetworkStore;
import org.onosproject.incubator.net.virtual.VirtualPort;
import org.onosproject.incubator.net.virtual.VnetService;
import org.onosproject.incubator.net.virtual.event.AbstractVirtualListenerManager;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DeviceId;
import org.onosproject.net.Port;
import org.onosproject.net.PortNumber;
import org.onosproject.net.intent.Intent;
import org.onosproject.net.intent.IntentData;
import org.onosproject.net.intent.IntentEvent;
import org.onosproject.net.intent.IntentListener;
import org.onosproject.net.intent.WorkPartitionService;
import org.onosproject.net.intent.IntentService;
import org.onosproject.net.intent.IntentState;
import org.onosproject.net.intent.Key;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import static com.google.common.base.Preconditions.*;

/**
 * Intent service implementation built on the virtual network service.
 */
public class VirtualNetworkIntentManager
        extends AbstractVirtualListenerManager<IntentEvent, IntentListener>
        implements IntentService, VnetService {

    private final Logger log = LoggerFactory.getLogger(getClass());

    private static final String NETWORK_ID_NULL = "Network ID cannot be null";
    private static final String DEVICE_NULL = "Device cannot be null";
    private static final String INTENT_NULL = "Intent cannot be null";
    private static final String KEY_NULL = "Key cannot be null";
    private static final String APP_ID_NULL = "Intent app identifier cannot be null";
    private static final String INTENT_KEY_NULL = "Intent key cannot be null";
    private static final String CP_NULL = "Connect Point cannot be null";

    protected IntentService intentService;
    protected VirtualNetworkStore store;
    protected WorkPartitionService partitionService;

    /**
     * Creates a new VirtualNetworkIntentService object.
     *
     * @param virtualNetworkManager virtual network manager service
     * @param networkId a virtual network identifier
     */
    public VirtualNetworkIntentManager(VirtualNetworkService virtualNetworkManager,
                                       NetworkId networkId) {

        super(virtualNetworkManager, networkId);

        this.store = serviceDirectory.get(VirtualNetworkStore.class);
        this.intentService = serviceDirectory.get(IntentService.class);
        this.partitionService = serviceDirectory.get(WorkPartitionService.class);
    }

    @Override
    public void submit(Intent intent) {
        checkNotNull(intent, INTENT_NULL);
        checkState(intent instanceof VirtualNetworkIntent, "Only VirtualNetworkIntent is supported.");
        checkArgument(validateIntent((VirtualNetworkIntent) intent), "Invalid Intent");

        intentService.submit(intent);
    }

    /**
     * Returns true if the virtual network intent is valid.
     *
     * @param intent virtual network intent
     * @return true if intent is valid
     */
    private boolean validateIntent(VirtualNetworkIntent intent) {
        checkNotNull(intent, INTENT_NULL);
        checkNotNull(intent.networkId(), NETWORK_ID_NULL);
        checkNotNull(intent.appId(), APP_ID_NULL);
        checkNotNull(intent.key(), INTENT_KEY_NULL);
        ConnectPoint ingressPoint = intent.ingressPoint();
        ConnectPoint egressPoint = intent.egressPoint();

        return (validateConnectPoint(ingressPoint) && validateConnectPoint(egressPoint));
    }

    /**
     * Returns true if the connect point is valid.
     *
     * @param connectPoint connect point
     * @return true if connect point is valid
     */
    private boolean validateConnectPoint(ConnectPoint connectPoint) {
        checkNotNull(connectPoint, CP_NULL);
        Port port = getPort(connectPoint.deviceId(), connectPoint.port());
        return port == null ? false : true;
    }

    /**
     * Returns the virtual port for the given device identifier and port number.
     *
     * @param deviceId   virtual device identifier
     * @param portNumber virtual port number
     * @return virtual port
     */
    private Port getPort(DeviceId deviceId, PortNumber portNumber) {
        checkNotNull(deviceId, DEVICE_NULL);

        Optional<VirtualPort> foundPort = manager.getVirtualPorts(this.networkId(), deviceId)
                .stream()
                .filter(port -> port.number().equals(portNumber))
                .findFirst();
        if (foundPort.isPresent()) {
            return foundPort.get();
        }
        return null;
    }

    @Override
    public void withdraw(Intent intent) {
        checkNotNull(intent, INTENT_NULL);
        // Withdraws the physical intents created due to the virtual intents.
        store.getTunnelIds(intent).forEach(tunnelId -> {
            Key intentKey = Key.of(tunnelId.id(), intent.appId());
            Intent physicalIntent = intentService.getIntent(intentKey);
            checkNotNull(physicalIntent, INTENT_NULL);

            // Withdraw the physical intent(s)
            log.debug("Withdrawing pt-pt intent: " + physicalIntent);
            intentService.withdraw(physicalIntent);
        });
        // Now withdraw the virtual intent
        log.debug("Withdrawing virtual intent: " + intent);
        intentService.withdraw(intent);
    }

    @Override
    public void purge(Intent intent) {
        checkNotNull(intent, INTENT_NULL);
        // Purges the physical intents created for each tunnelId.
        store.getTunnelIds(intent)
                .forEach(tunnelId -> {
                    Key intentKey = Key.of(tunnelId.id(), intent.appId());
                    Intent physicalIntent = intentService.getIntent(intentKey);
                    checkNotNull(physicalIntent, INTENT_NULL);

                    // Purge the physical intent(s)
                    intentService.purge(physicalIntent);
                    store.removeTunnelId(intent, tunnelId);
                });
        // Now purge the virtual intent
        intentService.purge(intent);
    }

    @Override
    public Intent getIntent(Key key) {
        checkNotNull(key, KEY_NULL);
        return store.getIntent(key);
    }

    @Override
    public Iterable<Intent> getIntents() {
        return store.getIntents();
    }

    @Override
    public void addPending(IntentData intentData) {
        intentService.addPending(intentData);
    }

    @Override
    public Iterable<IntentData> getIntentData() {
        return store.getIntentData();
    }

    @Override
    public long getIntentCount() {
        return Iterators.size(getIntents().iterator());
    }

    @Override
    public IntentState getIntentState(Key intentKey) {
        checkNotNull(intentKey, KEY_NULL);
        return Optional.ofNullable(store.getIntentData(intentKey))
                .map(IntentData::state)
                .orElse(null);
    }

    @Override
    public List<Intent> getInstallableIntents(Key intentKey) {
        List<Intent> intents = new ArrayList<>();
        getIntentData().forEach(intentData -> {
            if (intentData.intent().key().equals(intentKey)) {
                intents.addAll(intentData.installables());
            }
        });
        return intents;
    }

    @Override
    public boolean isLocal(Key intentKey) {
        checkNotNull(intentKey, INTENT_KEY_NULL);
        Intent intent = getIntent(intentKey);
        checkNotNull(intent, INTENT_NULL);
        return partitionService.isMine(intentKey, Key::hash);
    }

    @Override
    public Iterable<Intent> getPending() {
        return null;
    }
}
