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

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeDiagnosingMatcher;
import org.onosproject.net.flowobjective.NextObjective;
import org.onosproject.net.flowobjective.NextTreatment;
import java.util.ArrayList;
import java.util.List;

/**
 * Hamcrest matcher for nextObjective.
 */
public final class NextObjectiveJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {

    final NextObjective nextObjective;

    private NextObjectiveJsonMatcher(NextObjective nextObjective) {
        this.nextObjective = nextObjective;
    }

    @Override
    protected boolean matchesSafely(JsonNode jsonNextObj, Description description) {
        ObjectiveJsonMatcher.matchesObjective(nextObjective).matchesSafely(jsonNextObj);

        // check id
        int jsonId = jsonNextObj.get("id").asInt();
        int id = nextObjective.id();
        if (jsonId != id) {
            description.appendText("id was " + jsonId);
            return false;
        }

        // check type
        String jsonType = jsonNextObj.get("type").asText();
        String type = nextObjective.type().toString();
        if (!jsonType.equals(type)) {
            description.appendText("type was " + jsonType);
            return false;
        }

        // check size of treatment array
        JsonNode jsonTreatments = jsonNextObj.get("treatments");
        if (jsonTreatments.size() != nextObjective.next().size()) {
            description.appendText("treatments size was " + jsonTreatments.size());
            return false;
        }

        // check the weight
        boolean result = true;
        List<NextTreatment> nt = new ArrayList(nextObjective.nextTreatments());
        for (int i = 0; i < jsonTreatments.size(); i++) {
            ObjectNode jsonTreatment = jsonTreatments.path(i).isObject() &&
                    !jsonTreatments.path(i).isNull() ? (ObjectNode) jsonTreatments.path(i) : null;
            int jsonWeight = jsonTreatment.get("weight").asInt();
            if (jsonWeight != nt.get(i).weight()) {
                description.appendText("weight of NextTreatment with index " + i + " was " + jsonWeight);
                result = false;
            }
        }
        if (!result) {
            return false;
        }

        // TODO: need to check the content of treatment collection

        // TODO: need to check the content of selector instance

        return true;
    }

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

    /**
     * Factory to allocate a nextObjective matcher.
     *
     * @param nextObjective nextObjective object we are looking for
     * @return matcher
     */
    public static NextObjectiveJsonMatcher matchesNextObjective(NextObjective nextObjective) {
        return new NextObjectiveJsonMatcher(nextObjective);
    }
}
