/*
 * Copyright 2019-present Open Networking Foundation
 *
 * 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.ofoverlay.impl;

import org.onosproject.net.device.DeviceService;
import org.onosproject.workflow.api.ImmutableListWorkflow;
import org.onosproject.workflow.api.Workflow;
import org.onosproject.workflow.api.WorkflowExecutionService;
import org.onosproject.workflow.api.WorkflowStore;
import org.onosproject.workflow.api.WorkplaceStore;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.URI;
import java.util.concurrent.ScheduledExecutorService;

import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
import static org.onlab.util.Tools.groupedThreads;

/**
 * Class for Open-flow overlay configuration workflow.
 */
@Component(immediate = true)
public class OfOverlayWorkflow {

    private static final Logger log = LoggerFactory.getLogger(OfOverlayWorkflow.class);

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected WorkflowStore workflowStore;

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected WorkplaceStore workplaceStore;

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected WorkflowExecutionService workflowExecutionService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected DeviceService deviceService;

    private ScheduledExecutorService eventMapTriggerExecutor;

    @Activate
    public void activate() {
        log.info("Activated");

        eventMapTriggerExecutor = newSingleThreadScheduledExecutor(
                groupedThreads("onos/of-overlay", "eventmap-trigger-executor"));

        registerWorkflows();

    }

    @Deactivate
    public void deactivate() {
        log.info("Deactivated");
    }

    /**
     * Registers workflows.
     */
    private void registerWorkflows() {
        // registering class-loader
        workflowStore.registerLocal(this.getClass().getClassLoader());

        // registering new workflow definition
        URI uri = URI.create("of-overlay.workflow-nova");
        Workflow workflow = ImmutableListWorkflow.builder()
                .id(uri)
                //.attribute(WorkflowAttribute.REMOVE_AFTER_COMPLETE)
                .chain(Ovs.CreateOvsdbDevice.class.getName())
                .chain(Ovs.UpdateOvsVersion.class.getName())
                .chain(Ovs.UpdateOverlayBridgeId.class.getName())
                .chain(Ovs.CreateOverlayBridge.class.getName())
                .chain(Ovs.UpdateUnderlayBridgeId.class.getName())
                .chain(Ovs.CreateUnderlayBridge.class.getName())
                .chain(Ovs.CreateOverlayBridgeVxlanPort.class.getName())
                .chain(Ovs.AddPhysicalPortsOnUnderlayBridge.class.getName())
                .chain(Ovs.ConfigureUnderlayBridgeLocalIp.class.getName())
                .build();
        workflowStore.register(workflow);

        uri = URI.create("of-overlay.clean-workflow-nova");
        workflow = ImmutableListWorkflow.builder()
                .id(uri)
                //.attribute(WorkflowAttribute.REMOVE_AFTER_COMPLETE)
                .chain(Ovs.DeleteOverlayBridgeConfig.class.getName())
                .chain(Ovs.RemoveOverlayBridgeOfDevice.class.getName())
                .chain(Ovs.DeleteUnderlayBridgeConfig.class.getName())
                .chain(Ovs.RemoveUnderlayBridgeOfDevice.class.getName())
                .chain(Ovs.RemoveOvsdbDevice.class.getName())
                .build();
        workflowStore.register(workflow);

        uri = URI.create("of-overlay.workflow-ovs-leaf");
        workflow = ImmutableListWorkflow.builder()
                .id(uri)
                .chain(Ovs.CreateOvsdbDevice.class.getName())
                .chain(Ovs.UpdateOvsVersion.class.getName())
                .chain(Ovs.UpdateUnderlayBridgeId.class.getName())
                .chain(Ovs.CreateUnderlayBridge.class.getName())
                .chain(Ovs.AddPhysicalPortsOnUnderlayBridge.class.getName())
                .build();
        workflowStore.register(workflow);

        uri = URI.create("of-overlay.workflow-ovs-spine");
        workflow = ImmutableListWorkflow.builder()
                .id(uri)
                .chain(Ovs.CreateOvsdbDevice.class.getName())
                .chain(Ovs.UpdateOvsVersion.class.getName())
                .chain(Ovs.UpdateUnderlayBridgeId.class.getName())
                .chain(Ovs.CreateUnderlayBridge.class.getName())
                .chain(Ovs.AddPhysicalPortsOnUnderlayBridge.class.getName())
                .build();
        workflowStore.register(workflow);

        deviceService.addListener(
                event -> {
                    // trigger EventTask for DeviceEvent
                    eventMapTriggerExecutor.submit(
                            () -> workflowExecutionService.eventMapTrigger(
                                    event,
                                    // event hint supplier
                                    (ev) -> {
                                        if (ev == null || ev.subject() == null) {
                                            return null;
                                        }
                                        String hint = event.subject().id().toString();
                                        log.debug("hint: {}", hint);
                                        return hint;
                                    }
                            )
                    );
                }
        );

    }

}
