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

import com.google.common.base.MoreObjects;

/**
 * Primitive Metric Value.
 */
public final class MetricValue {

    private final long rate;
    private final long load;
    private final long count;

    /**
     * Constructs a metric value using the given rate, load and count.
     *
     * @param rate rate
     * @param load load
     * @param count count
     */
    private MetricValue(long rate, long load, long count) {
        this.rate = rate;
        this.load = load;
        this.count = count;
    }

    /**
     * Returns rate value.
     *
     * @return rate
     */
    public long getRate() {
        return rate;
    }

    /**
     * Returns load value.
     *
     * @return load
     */
    public long getLoad() {
        return load;
    }

    /**
     * Returns count value.
     *
     * @return cound
     */
    public long getCount() {
        return count;
    }

    /**
     * MetricValue builder class.
     */
    public static final class Builder {
        private long rate;
        private long load;
        private long count;

        /**
         * Sets rate value.
         *
         * @param rate rate value
         * @return Builder object
         */
        public Builder rate(long rate) {
            this.rate = rate;
            return this;
        }

        /**
         * Sets load value.
         *
         * @param load load value
         * @return Builder object
         */
        public Builder load(long load) {
            this.load = load;
            return this;
        }

        /**
         * Sets count value.
         *
         * @param count count value
         * @return Builder object
         */
        public Builder count(long count) {
            this.count = count;
            return this;
        }

        /**
         * Builds a MetricValue object.
         *
         * @return MetricValue object
         */
        public MetricValue add() {
            return new MetricValue(rate, load, count);
        }
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof MetricValue) {
            MetricValue other = (MetricValue) obj;
            if (this.rate == other.rate &&
                    this.load == other.load &&
                    this.count == other.count) {
                return true;
            }
        }
        return false;
    }

    @Override
    public int hashCode() {
        final int prime = 1004;
        int result = super.hashCode();
        result = prime * result + (int) this.rate;
        result = prime * result + (int) this.load;
        result = prime * result + (int) this.count;
        return result;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(getClass())
                .add("rate", Long.toHexString(rate))
                .add("load", Long.toHexString(load))
                .add("count", Long.toHexString(count)).toString();
    }
}
