/*
 * Copyright 2014 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.onlab.util;

import java.util.Arrays;

import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;

/**
 * Helper to print byte[] length and hashCode.
 */
public final class ByteArraySizeHashPrinter {

    private final byte[] bytes;

    /**
     * Returns ByteArraySizeHashPrinter wrapping given byte[].
     *
     * @param bytes bytes to wrap around
     * @return ByteArraySizeHashPrinter
     */
    public static ByteArraySizeHashPrinter of(byte[] bytes) {
        return new ByteArraySizeHashPrinter(bytes);
    }

    /**
     * Returns ByteArraySizeHashPrinter wrapping given byte[].
     *
     * @param bytes bytes to wrap around
     * @return null if {@code bytes == null}, ByteArraySizeHashPrinter otherwise
     */
    public static ByteArraySizeHashPrinter orNull(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        return new ByteArraySizeHashPrinter(bytes);
    }

    public ByteArraySizeHashPrinter(byte[] bytes) {
        this.bytes = bytes;
    }

    @Override
    public String toString() {
        ToStringHelper helper = MoreObjects.toStringHelper("byte[]");
        if (bytes != null) {
            helper.add("length", bytes.length)
                  .add("hash", Arrays.hashCode(bytes));
        } else {
            helper.addValue(bytes);
        }
        return helper.toString();
    }
}
