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

import org.hamcrest.Description;
import org.hamcrest.TypeSafeDiagnosingMatcher;
import org.onosproject.net.group.GroupBucket;

import com.fasterxml.jackson.databind.JsonNode;

/**
 * Hamcrest matcher for instructions.
 */
public final class GroupBucketJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {

    private final GroupBucket bucket;

    private GroupBucketJsonMatcher(GroupBucket bucket) {
        this.bucket = bucket;
    }

    /**
     * Matches the contents of a group bucket.
     *
     * @param bucketJson JSON representation of bucket to match
     * @param description Description object used for recording errors
     * @return true if contents match, false otherwise
     */
    @Override
    public boolean matchesSafely(JsonNode bucketJson, Description description) {

        // check type
        final String jsonType = bucketJson.get("type").textValue();
        if (!bucket.type().name().equals(jsonType)) {
            description.appendText("type was " + jsonType);
            return false;
        }

        final long jsonWeight = bucketJson.get("weight").longValue();
        if (bucket.weight() != jsonWeight) {
            description.appendText("weight was " + jsonWeight);
            return false;
        }

        final long packetsJson = bucketJson.get("packets").asLong();
        if (bucket.packets() != packetsJson) {
            description.appendText("packets was " + packetsJson);
            return false;
        }

        final long bytesJson = bucketJson.get("bytes").asLong();
        if (bucket.bytes() != bytesJson) {
            description.appendText("bytes was " + packetsJson);
            return false;
        }

        return true;
    }

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

    /**
     * Factory to allocate an bucket matcher.
     *
     * @param bucket bucket object we are looking for
     * @return matcher
     */
    public static GroupBucketJsonMatcher matchesGroupBucket(GroupBucket bucket) {
        return new GroupBucketJsonMatcher(bucket);
    }
}
