#pragma once

#include <QChar>
#include <QString>
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui {
class CalculatorForm;
}
QT_END_NAMESPACE

// CalculatorDesigner —— 计算器面板（QWidget）。
// 【Day3 calculator_mainwindow】相对 ../calculator_designer_ext/ 版仅两处改动：
//   ① 新增 evaluated(expression,result) 信号：按 = 求值成功后发出，供 MainWindow
//      的历史停靠窗订阅（演示「给已有部件加信号，与外壳通信」）。
//   ② 新增 loadExpression(expr)：把一条历史表达式回填到编辑区（演示「部件对外
//      提供 API」，配合历史双击回填）。
//   其余输入校验/状态机/求值逻辑一字未改。
class CalculatorDesigner : public QWidget {
    Q_OBJECT
public:
    explicit CalculatorDesigner(QWidget* parent = nullptr);
    ~CalculatorDesigner() override;

    // 供自测直接调用，效果等价于点击对应按钮；逻辑与 ../calculator_designer_ext/ 版一字不差。
    void onDigit(int digit);
    void onDot();
    void onOperator(QChar op);
    void onLeftParen();
    void onRightParen();
    void onEquals();
    void onClear();
    void onBackspace();

    QString displayText() const;
    QString expressionText() const;

    // 【新增】把一条历史表达式回填到编辑区（历史双击时调用）。
    void loadExpression(const QString& expr);

signals:
    // 【新增】按 = 求值成功后发出，参数为（自动补全括号后的表达式, 结果文本）。
    void evaluated(const QString& expression, const QString& result);

private:
    // 单个运算数（数字串）允许的最大长度，要求不得小于 10 位。
    static constexpr int kMaxOperandLength = 15;
    static_assert(kMaxOperandLength >= 10, "单个运算数的最大长度不得小于 10 位");
    // 表达式总长度上限，要求不得低于 100 个字符。
    static constexpr int kMaxExpressionLength = 200;
    static_assert(kMaxExpressionLength >= 100, "表达式总长度上限不得低于 100 个字符");

    QString currentOperandToken() const;
    int currentOperandDigitCount() const;
    QString lastNumberToken() const;
    void refreshDisplays();
    void showError();

    Ui::CalculatorForm* ui;
    QString m_expression;      // 当前正在编辑的表达式，例如 "12+3*(4-2"
    QString m_lastResultText;  // 上一次成功计算得到的结果文本
    int m_openParenCount = 0;  // 尚未闭合的左括号数量
    bool m_resultShown = false;  // 显示区当前展示的是计算结果而非正在输入的数字
    bool m_error = false;
};
