/*
 * Copyright 2015-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.codec.impl;

import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
import org.onlab.packet.Ethernet;

import com.fasterxml.jackson.databind.JsonNode;

/**
 * Hamcrest matcher for ethernet objects.
 */
public final class EthernetJsonMatcher extends TypeSafeMatcher<JsonNode> {

    private final Ethernet ethernet;
    private String reason = "";

    private EthernetJsonMatcher(Ethernet ethernetValue) {
        ethernet = ethernetValue;
    }

    @Override
    public boolean matchesSafely(JsonNode jsonEthernet) {

        // check source MAC
        final JsonNode jsonSourceMacNode = jsonEthernet.get("srcMac");
        if (ethernet.getSourceMAC() != null) {
            final String jsonSourceMac = jsonSourceMacNode.textValue();
            final String sourceMac = ethernet.getSourceMAC().toString();
            if (!jsonSourceMac.equals(sourceMac)) {
                reason = "source MAC " + ethernet.getSourceMAC().toString();
                return false;
            }
        } else {
            //  source MAC not specified, JSON representation must be empty
            if (jsonSourceMacNode != null) {
                reason = "source mac should be null ";
                return false;
            }
        }

        // check destination MAC
        final JsonNode jsonDestinationMacNode = jsonEthernet.get("destMac");
        if (ethernet.getDestinationMAC() != null) {
            final String jsonDestinationMac = jsonDestinationMacNode.textValue();
            final String destinationMac = ethernet.getDestinationMAC().toString();
            if (!jsonDestinationMac.equals(destinationMac)) {
                reason = "destination MAC " + ethernet.getDestinationMAC().toString();
                return false;
            }
        } else {
            //  destination MAC not specified, JSON representation must be empty
            if (jsonDestinationMacNode != null) {
                reason = "destination mac should be null ";
                return false;
            }
        }

        // check priority code
        final short jsonPriorityCode = jsonEthernet.get("priorityCode").shortValue();
        final short priorityCode = ethernet.getPriorityCode();
        if (jsonPriorityCode != priorityCode) {
            reason = "priority code " + Short.toString(ethernet.getPriorityCode());
            return false;
        }

        // check vlanId
        final short jsonVlanId = jsonEthernet.get("vlanId").shortValue();
        final short vlanId = ethernet.getVlanID();
        if (jsonVlanId != vlanId) {
            reason = "vlan id " + Short.toString(ethernet.getVlanID());
            return false;
        }

        // check etherType
        final short jsonEtherType = jsonEthernet.get("etherType").shortValue();
        final short etherType = ethernet.getEtherType();
        if (jsonEtherType != etherType) {
            reason = "etherType " + Short.toString(ethernet.getEtherType());
            return false;
        }

        // check pad
        final boolean jsonPad = jsonEthernet.get("pad").asBoolean();
        final boolean pad = ethernet.isPad();
        if (jsonPad != pad) {
            reason = "pad " + Boolean.toString(ethernet.isPad());
            return false;
        }

        return true;
    }

    @Override
    public void describeTo(Description description) {
        description.appendText(reason);
    }

    /**
     * Factory to allocate a ethernet matcher.
     *
     * @param ethernet ethernet object we are looking for
     * @return matcher
     */
    public static EthernetJsonMatcher matchesEthernet(Ethernet ethernet) {
        return new EthernetJsonMatcher(ethernet);
    }
}
