﻿/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Kafka.Client.Util
{
    /// <summary>
    /// Utilty class for managing bits and bytes.
    /// </summary>
    public class BitWorks
    {
        /// <summary>
        /// Converts the value to bytes and reverses them.
        /// </summary>
        /// <param name="value">The value to convert to bytes.</param>
        /// <returns>Bytes representing the value.</returns>
        public static byte[] GetBytesReversed(short value)
        {
            return ReverseBytes(BitConverter.GetBytes(value));
        }

        /// <summary>
        /// Converts the value to bytes and reverses them.
        /// </summary>
        /// <param name="value">The value to convert to bytes.</param>
        /// <returns>Bytes representing the value.</returns>
        public static byte[] GetBytesReversed(int value)
        {
            return ReverseBytes(BitConverter.GetBytes(value));
        }

        /// <summary>
        /// Converts the value to bytes and reverses them.
        /// </summary>
        /// <param name="value">The value to convert to bytes.</param>
        /// <returns>Bytes representing the value.</returns>
        public static byte[] GetBytesReversed(long value)
        {
            return ReverseBytes(BitConverter.GetBytes(value));
        }

        /// <summary>
        /// Reverse the position of an array of bytes.
        /// </summary>
        /// <param name="inArray">
        /// The array to reverse.  If null or zero-length then the returned array will be null.
        /// </param>
        /// <returns>The reversed array.</returns>
        public static byte[] ReverseBytes(byte[] inArray)
        {
            if (inArray != null && inArray.Length > 0)
            {
                int highCtr = inArray.Length - 1;
                byte temp;

                for (int ctr = 0; ctr < inArray.Length / 2; ctr++)
                {
                    temp = inArray[ctr];
                    inArray[ctr] = inArray[highCtr];
                    inArray[highCtr] = temp;
                    highCtr -= 1;
                }
            }

            return inArray;
        }
    }
}
