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

import org.onlab.packet.MacAddress;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.net.DeviceId;
import org.onosproject.net.Host;
import org.onosproject.net.HostId;
import org.onosproject.net.host.HostService;
import org.onosproject.ui.UiTopoOverlay;
import org.onosproject.ui.topo.PropertyPanel;
import org.onosproject.vtnrsc.PortPair;
import org.onosproject.vtnrsc.VirtualPort;
import org.onosproject.vtnrsc.VirtualPortId;
import org.onosproject.vtnrsc.portpair.PortPairService;
import org.onosproject.vtnrsc.virtualport.VirtualPortService;

/**
 * Our sfcweb topology overlay.
 */
public class SfcwebUiTopovOverlay extends UiTopoOverlay {

    // NOTE: this must match the ID defined in sfcwebTopov.js
    private static final String OVERLAY_ID = "SFC-Service-overlay";
    private static final String MY_DEVICE_TITLE = "SFF specific device details";
    private static final String MY_HOST_TITLE = "SF specific host details";

    public SfcwebUiTopovOverlay() {
        super(OVERLAY_ID);
    }

    @Override
    public void modifyDeviceDetails(PropertyPanel pp, DeviceId deviceId) {
        pp.title(MY_DEVICE_TITLE);
        pp.removeAllProps();
        pp.addProp("SFF Device Id", deviceId.toString());
    }

    @Override
    public void modifyHostDetails(PropertyPanel pp, HostId hostId) {
        pp.title(MY_HOST_TITLE);
        pp.removeAllProps();
        PortPairService portPairService = AbstractShellCommand.get(PortPairService.class);
        VirtualPortService virtualPortService = AbstractShellCommand.get(VirtualPortService.class);
        HostService hostService = AbstractShellCommand.get(HostService.class);
        Iterable<PortPair> portPairs = portPairService.getPortPairs();
        for (PortPair portPair : portPairs) {
            VirtualPort vPort = virtualPortService.getPort(VirtualPortId.portId(portPair.ingress()));
            MacAddress dstMacAddress = vPort.macAddress();
            Host host = hostService.getHost(HostId.hostId(dstMacAddress));
            if (hostId.toString().equals(host.id().toString())) {
                pp.addProp("SF Name", portPair.name());
                pp.addProp("SF Ip", vPort.fixedIps().iterator().next().ip());
            }
        }
        pp.addProp("SF host Address", hostId.toString());
    }

}
