/*
 * Copyright 2016-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.proxyarp;

import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.net.intf.InterfaceService;
import org.onosproject.net.neighbour.DefaultNeighbourMessageHandler;
import org.onosproject.net.neighbour.NeighbourResolutionService;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.edge.EdgePortEvent;
import org.onosproject.net.edge.EdgePortListener;
import org.onosproject.net.edge.EdgePortService;

/**
 * Implements proxy ARP and NDP functionality by considering the entire network
 * as a single L2 broadcast domain.
 * <p>
 * This application maintains a DefaultNeighbourMessageHandler on all edge ports
 * in the network, and the handler implements the desired proxying functionality.
 * </p>
 */
@Component(immediate = true)
public class DefaultProxyArp {

    private static final String APP_NAME = "org.onosproject.proxyarp";

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected EdgePortService edgeService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected NeighbourResolutionService neighbourResolutionService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected CoreService coreService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
    protected InterfaceService interfaceService;

    private ApplicationId appId;

    private InternalEdgeListener edgeListener = new InternalEdgeListener();
    private DefaultNeighbourMessageHandler defaultHandler;

    @Activate
    protected void activate() {
        appId = coreService.registerApplication(APP_NAME);

        edgeService.addListener(edgeListener);
        edgeService.getEdgePoints().forEach(this::addDefault);

        defaultHandler = new DefaultNeighbourMessageHandler(interfaceService);
    }

    @Deactivate
    protected void deactivate() {
        edgeService.removeListener(edgeListener);
        neighbourResolutionService.unregisterNeighbourHandlers(appId);
    }

    private void addDefault(ConnectPoint port) {
        neighbourResolutionService.registerNeighbourHandler(port, defaultHandler, appId);
    }

    private void removeDefault(ConnectPoint port) {
        neighbourResolutionService.unregisterNeighbourHandler(port, defaultHandler, appId);
    }

    private class InternalEdgeListener implements EdgePortListener {
        @Override
        public void event(EdgePortEvent event) {
            switch (event.type()) {
            case EDGE_PORT_ADDED:
                addDefault(event.subject());
                break;
            case EDGE_PORT_REMOVED:
                removeDefault(event.subject());
                break;
            default:
                break;
            }
        }
    }
}
