/**
 * @file gui.h
 * @brief Library for the calculator GUI.
 */

#ifndef GUI_H
#define GUI_H

#include <QMainWindow>
#include <QKeyEvent>
#include <QString>
#include "../mathlib.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Gui; }
QT_END_NAMESPACE

/**
 * @class Gui
 * @brief Main window class for the calculator GUI.
 *
 * Handles user input, updates the display, and evaluates expressions
 * using functions from mathlib.
 */
class Gui : public QMainWindow
{
    Q_OBJECT

public:
    explicit Gui(QWidget *parent = nullptr);
    ~Gui();

private slots:
    /// Digit button handlers
    void on_btn_0_clicked();
    void on_btn_1_clicked();
    void on_btn_2_clicked();
    void on_btn_3_clicked();
    void on_btn_4_clicked();
    void on_btn_5_clicked();
    void on_btn_6_clicked();
    void on_btn_7_clicked();
    void on_btn_8_clicked();
    void on_btn_9_clicked();

    /// Operation button handlers
    void on_btn_plus_clicked();
    void on_btn_minus_clicked();
    void on_btn_mul_clicked();
    void on_btn_div_clicked();
    void on_btn_mod_clicked();
    void on_btn_pow_clicked();
    void on_btn_root_clicked();
    void on_btn_fac_clicked();

    /// Control buttons
    void on_btn_clear_clicked();
    void on_btn_equal_clicked();
    void on_btn_dot_clicked();

private:
    Ui::Gui *ui;
    QString currentExpression;
    bool justEvaluated;

    void updateDisplay();
    void showError(mathlib::MathError err);

    /// Keyboard input handler
    void keyPressEvent(QKeyEvent *event) override;

    /// Helpers for input validation
    bool endsWithOperator() const;
    bool hasOperator() const;
    int  findOperatorPos(QChar op) const;
    void appendDigit(const QString &digit);
    void appendOperator(const QString &op);
};

#endif // GUI_H