const Node = require('./Node');

class BinaryTree {
  constructor(arr) {
    if (!Array.isArray(arr) || !arr.length) {
      throw new Error('Invalid argument to create a Binary Tre');
    }
    this.root = this.createBinaryTree((this.root = null), arr, 0);
  }

  // eslint-disable-next-line class-methods-use-this
  createBinaryTree(root, arr, i) {
    if (i < arr.length) {
      // eslint-disable-next-line no-param-reassign
      root = new Node(arr[i]);
      // eslint-disable-next-line no-param-reassign
      root.leftChild = this.createBinaryTree(root.leftChild, arr, 2 * i + 1);
      // eslint-disable-next-line no-param-reassign
      root.rightChild = this.createBinaryTree(root.rightChild, arr, 2 * i + 2);
    }
    return root;
  }

  traversePreorder(root) {
    let arr = [];

    if (root === null) return arr;
    // push node to arr
    arr.push(root.value);

    // push left node
    const left = this.traversePreorder(root.leftChild);
    arr = [...arr, ...left];

    // push right node
    const right = this.traversePreorder(root.rightChild);
    arr = [...arr, ...right];

    return arr;
  }

  preOrder() {
    return this.traversePreorder(this.root);
  }
}

// const bt = new BinaryTree([1, 2, 3, 4, 5, 6]);
// console.log(bt.root);
// console.log(bt.preOrder());

module.exports = BinaryTree;