// ============================================================================
//  qt_state_machine —— 教学补充示例（非 wiki 生成，手工维护）
//  用途：方案书「C++方向 Day4」要求的状态机实战（QStateMachine 属于 QtCore，
//        不需要额外模块），仓库 p03/ 原有 wiki 抓取内容未覆盖这一点，故补一个
//        最小示例：一个“红灯/绿灯”两态按钮，点击在两态间切换。
//  配套文档：docs/teaching/examples/state_machine/README.md
//  离屏验证：QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_state_machine（自动退出）
// ============================================================================

#include <QApplication>
#include <QPushButton>
#include <QStateMachine>
#include <QState>
#include <QTimer>

int main(int argc, char* argv[]) {
    QApplication app(argc, argv);

    QPushButton button;
    button.resize(140, 40);

    QStateMachine machine;
    auto* redState = new QState(&machine);
    auto* greenState = new QState(&machine);

    // 进入某个状态时执行的动作：改文本、改样式——状态机负责“流转”，
    // 具体每个状态“长什么样”交给 assignProperty/连接槽函数。
    redState->assignProperty(&button, "text", QStringLiteral("红灯：禁止通行"));
    redState->assignProperty(&button, "styleSheet", QStringLiteral("background-color:#c0392b;color:white;"));
    greenState->assignProperty(&button, "text", QStringLiteral("绿灯：允许通行"));
    greenState->assignProperty(&button, "styleSheet", QStringLiteral("background-color:#27ae60;color:white;"));

    // 点击按钮触发状态切换：red --clicked--> green --clicked--> red ...
    redState->addTransition(&button, &QPushButton::clicked, greenState);
    greenState->addTransition(&button, &QPushButton::clicked, redState);

    machine.setInitialState(redState);
    machine.start();

    button.show();

    // 仅在离屏自动化验证时（QT_QPA_PLATFORM=offscreen）：100ms 后模拟一次点击
    // （red -> green），再等 200ms 确认状态机正常处理完过渡后自动退出。
    // 正常运行（有显示环境）需用户手动点击按钮切换状态，窗口保持打开。
    if (qgetenv("QT_QPA_PLATFORM") == "offscreen") {
        QTimer::singleShot(100, &button, [&button]() { button.click(); });
        QTimer::singleShot(300, &app, &QApplication::quit);
    }
    return app.exec();
}
