let display = document.querySelector(".display");
const buttons = document.querySelectorAll(".btn");

const ops = {
  firstNum: String(),
  secondNum: String(),
  operator: undefined,
  lastOperator: undefined,
  numFlag: false,
  onSecondNumber: false,
  stringLength: 8,
  periodClicked: false,
  result: String(),

  toggleNumFlag: function () {
    this.numFlag = !this.numFlag;
  },
  clear: function () {
    this.firstNum = String();
    this.secondNum = String();
    this.operator = undefined;
    this.numFlag = false;
    this.onSecondNumber = false;
    this.result = String();
    display.textContent = "0";
  },
  appendNumber: function (num) {
    if (num === "0" && display.textContent.trim() === "0") return;
    if (!ops.numFlag && ops.checkLength(ops.firstNum)) {
      ops.firstNum += num;
      updateDisplay(ops.firstNum);
    } else if (this.numFlag) {
      if (this.checkLength(ops.secondNum)) {
        ops.secondNum += num;
        updateDisplay(ops.secondNum);
      }
    }
  },
  checkLength: function (string) {
    return string.length < this.stringLength;
  },
};

function add(x, y) {
  return x + y;
}

function subtract(x, y) {
  return x - y;
}

function multiply(x, y) {
  return x * y;
}

function divede(x, y) {
  if (x === 0) {
    return 0;
  } else if (y === 0) {
    alert("Cannot divide by 0!");
    return "Error";
  }
  return x / y;
}

function operate(firstNum, secondNum, operator) {
  switch (operator) {
    case "+":
      return add(firstNum, secondNum);
    case "-":
      return subtract(firstNum, secondNum);
    case "*":
      return multiply(firstNum, secondNum);
    case "/":
      return divede(firstNum, secondNum);
  }
}

function handleOperation() {
  const first = Number(ops.firstNum);
  const second = Number(ops.secondNum);
  console.log(`last operator: ${ops.operator}`);
  let result = operate(first, second, ops.operator);

  if (result === "Error") {
    ops.clear();
    return;
  }

  result = roundThreeDecimals(result);
  updateDisplay(result);

  // store result
  ops.result = result;

  if (ops.operator === "=") {
    ops.firstNum = String();
    ops.secondNum = String();
    ops.numFlag = false;
    ops.onSecondNumber = false;
  } else {
    ops.firstNum = ops.result;
    ops.secondNum = "";
    ops.operator = "";
    ops.onSecondNumber = true;
  }
  ops.operator = undefined;
    ops.lastOperator = undefined;
}

function updateDisplay(displayValue) {
  display.textContent = displayValue;
}

function roundThreeDecimals(number) {
  if (!Number.isInteger(number) && Number.isFinite(number)) {
    return parseFloat(number.toPrecision(3));
  } else {
    return number;
  }
}

function handleOperatorClick(operatorClicked) {
  ops.operator = operatorClicked;
  // TODO handle ops for = or clear
  if (operatorClicked === "cls") {
    ops.clear();
    return;
  } else if (operatorClicked === "=") {
    if (ops.lastOperator) {
      ops.operator = ops.lastOperator;
    }
    handleOperation();
    return;
  } else if (operatorClicked === "+/-") {
    negateNumber();
    return;
  } else if (operatorClicked === "%") {
    percentageNumber();
    return;
  } else {
    if (ops.secondNum && ops.numFlag) {
      ops.lastOperator = operatorClicked;
      handleOperation();
      return;
    }
  }

  //TODO fix this conditional should be if numFlag and a check if = or additional ops
  if (!ops.onSecondNumber) {
    ops.numFlag = true;
    if (ops.result !== "") {
      console.log("this is running the ops.result");
      ops.firstNum = ops.result;
      ops.onSecondNumber = true;
      return;
    }
  }
  // ops.onSecondNumber = !ops.onSecondNumber;
}

function calculator(event) {
  if (event.target.dataset.ops === "") {
    handleOperatorClick(event.target.value);
  } else if (event.target.value === ".") {
    if (display.textContent.includes(".")) {
      return;
    } else {
      ops.appendNumber(event.target.value);
    }
  } else if (event.target.dataset.num === "") {
    ops.appendNumber(event.target.value);
  }
}

function negateNumber() {
  // returns a negated number
  let negated;
  if (!ops.numFlag || ops.secondNum === "") {
    negated = Number(ops.firstNum) * -1;
    ops.firstNum = String(negated);
  } else {
    negated = Number(ops.secondNum) * -1;
    ops.secondNum = String(negated);
  }
  updateDisplay(negated);
}

function percentageNumber() {
  let percent;
  if (!ops.numFlag || !ops.secondNum === "") {
    percent = Number(ops.firstNum) / 100;
    ops.firstNum = String(percent);
  } else if (ops.result !== "") {
    percent = Number(ops.result) / 100;
  } else {
    percent = Number(ops.secondNum) / 100;
    ops.secondNum = String(percent);
  }
  updateDisplay(percent);
}

buttons.forEach((btn) => {
  btn.addEventListener("click", calculator);
});