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);
    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.lastOperator === '=') {
        ops.firstNum = String();
        ops.secondNum = String();
        ops.numFlag = false;
        ops.onSecondNumber = !ops.onSecondNumber;
    } else {
        ops.firstNum = ops.result;
        ops.secondNum = "";
        ops.onSecondNumber = true;
    }
    // ops.operator = 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.lastOperator = operatorClicked;
    // TODO handle ops for = or clear
    if (operatorClicked === 'cls') {
        ops.clear();
        return;
    } else if (operatorClicked === '=') {
        ops.lastOperator = '=';
        handleOperation();
        return;
    } else if (operatorClicked === '+/-') {
        negateNumber();
        return;
    } else if (operatorClicked === '%') {
        percentageNumber();
        return;
    } else {
        if(ops.secondNum && ops.numFlag){
            handleOperation();
            return;
        }
    }

    
    ops.operator = operatorClicked;
    //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.onSecondNumber) {
        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.onSecondNumber)) {
        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);
});
