#include "mainwindow.h"
#include "cal.h"
#include "ui_mainwindow.h"
#include <QMessageBox>

static QString displayText;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow) {
  ui->setupUi(this);
  ui->lineEdit->setText("0");
  result = 0.0;
  waitForOperand = true;

  connectSlots();
}

MainWindow::~MainWindow() { delete ui; }

//错误处理
void MainWindow::abortOperation() {
  result = 0.0;
  pendingOperator.clear();
  ui->lineEdit->setText("0");
  isFinished = false;
  QMessageBox::warning(this, "运算错误", "算式不合法");
}

//数字被点击
void MainWindow::digitClicked() {
  QPushButton *digitBtn = static_cast<QPushButton *>(sender());
  //    if(ui->lineEdit->text() == "0" && value == "0")
  //        return;
  if (!isFinished) {
    displayText.append(digitBtn->text());
    ui->lineEdit->setText(displayText);
  } else {
    return;
  }
}

void MainWindow::on_clearBtn_clicked() {
  //将当前显示的数归零
  displayText.chop(1);
  ui->lineEdit->setText(displayText);
  isFinished = false;
}

void MainWindow::on_clearAllBtn_clicked() {
  //将当前显示的数据归零，并将之前保存的数据运算清除
  displayText.clear();
  ui->lineEdit->setText(displayText);
  isFinished = false;
  result = 0.0;
}

void MainWindow::on_equalBtn_clicked() {
  try {
    result = compute(inToPost(ui->lineEdit->text()));
  }

  catch (...) {
    abortOperation();
  }
  isFinished = 1;
  ui->lineEdit->setText(QString::number(result));
}

//运算符
void MainWindow::operatorClicked() {
  QPushButton *clickedBtn = qobject_cast<QPushButton *>(sender());
  if (!isFinished) {
    displayText.append(clickedBtn->text());
    ui->lineEdit->setText(displayText);
  } else {
    return;
  }
}

//槽链接
void MainWindow::connectSlots() {

  QPushButton *digitBtns[10] = {ui->digitBtn0, ui->digitBtn1, ui->digitBtn2,
                                ui->digitBtn3, ui->digitBtn4, ui->digitBtn5,
                                ui->digitBtn6, ui->digitBtn7, ui->digitBtn8,
                                ui->digitBtn9};
  for (auto btn : digitBtns)
    connect(btn, &QPushButton::clicked, this, &MainWindow::digitClicked);
  QPushButton *operatorBtns[8] = {
      ui->addBtn,    ui->subtractionBtn, ui->mulBtn, ui->divisionBtn,
      ui->squareBtn, ui->pointBtn,       ui->LBtn,   ui->RBtn};
  for (auto btn : operatorBtns)
    connect(btn, &QPushButton::clicked, this, &MainWindow::operatorClicked);
}

void MainWindow::keyPressEvent(QKeyEvent *event) {
  switch (event->key()) {
  case Qt::Key_0:
    emit ui->digitBtn0->clicked();
    break;
  case Qt::Key_1:
    emit ui->digitBtn1->clicked();
    break;
  case Qt::Key_2:
    emit ui->digitBtn2->clicked();
    break;
  case Qt::Key_3:
    emit ui->digitBtn3->clicked();
    break;
  case Qt::Key_4:
    emit ui->digitBtn4->clicked();
    break;
  case Qt::Key_5:
    emit ui->digitBtn5->clicked();
    break;
  case Qt::Key_6:
    emit ui->digitBtn6->clicked();
    break;
  case Qt::Key_7:
    emit ui->digitBtn7->clicked();
    break;
  case Qt::Key_8:

  default:
    break;
  }
}
