/**
 * Binary functions.
 *
 * @author n1474335 [n1474335@gmail.com]
 * @copyright Crown Copyright 2018
 * @license Apache-2.0
 */

import Utils from "../Utils.mjs";


/**
 * Convert a byte array into a binary string.
 *
 * @param {Uint8Array|byteArray} data
 * @param {string} [delim="Space"]
 * @param {number} [padding=8]
 * @returns {string}
 *
 * @example
 * // returns "00010000 00100000 00110000"
 * toBinary([10,20,30]);
 *
 * // returns "00010000 00100000 00110000"
 * toBinary([10,20,30], ":");
 */
export function toBinary(data, delim="Space", padding=8) {
    if (!data) return "";

    delim = Utils.charRep(delim);
    let output = "";

    for (let i = 0; i < data.length; i++) {
        output += data[i].toString(2).padStart(padding, "0") + delim;
    }

    if (delim.length) {
        return output.slice(0, -delim.length);
    } else {
        return output;
    }
}


/**
 * Convert a binary string into a byte array.
 *
 * @param {string} data
 * @param {string} [delim]
 * @param {number} [byteLen=8]
 * @returns {byteArray}
 *
 * @example
 * // returns [10,20,30]
 * fromBinary("00010000 00100000 00110000");
 *
 * // returns [10,20,30]
 * fromBinary("00010000:00100000:00110000", "Colon");
 */
export function fromBinary(data, delim="Space", byteLen=8) {
    const delimRegex = Utils.regexRep(delim);
    data = data.replace(delimRegex, "");

    const output = [];
    for (let i = 0; i < data.length; i += byteLen) {
        output.push(parseInt(data.substr(i, byteLen), 2));
    }
    return output;
}

