#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QStatusBar>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

#include "worker.h"
#include "update.h"
#include "update_dc_event.h"

#define EMERGENCY_LEAVE_BL 0

class hwinf;
class MainWindow : public QMainWindow {
    Q_OBJECT

protected:
    void customEvent(QEvent *event) override;
    // bool eventFilter(QObject *obj, QEvent *ev) override;

public:
    MainWindow(hwinf *hw, Worker *worker, Update *update, QWidget *parent = nullptr);
    ~MainWindow();

    static const int START_PROGRESS_LOOP = -1;
    static const int STOP_PROGRESS_LOOP = -2;
    static const int BL_START_COUNT = 5;
    static const int BL_CHECK_COUNT = 5;
    static const int BL_IS_UP_COUNT = 5;
    static const int BL_STOP_COUNT = 5;

    int progressValue() const { return m_progressValue; }
    hwinf *getPlugin() { return m_hw; }
    hwinf const *getPlugin() const { return m_hw; }
    Update *getUpdate() { return m_update; }
    Update const *getUpdate() const { return m_update; }
    UpdateDcEvent::UpdateStep updateStep() const { return m_updateStep; }
    void setUpdateStep(UpdateDcEvent::UpdateStep updateStep) { m_updateStep = updateStep; }

public slots:
    void onAppendText(QString, QString suffix = "");
    void onReplaceLast(QStringList, QString suffix = "");
    void onReplaceLast(QString, QString suffix = "");
    void onShowErrorMessage(QString, QString);
    void onShowStatusMessage(QString, QString);
    void onStopStartTimer();
    void onRestartExitTimer();
    void onEnableExit();
    void onDisableExit();
#if EMERGENCY_LEAVE_BL==1
    void emergencyLeaveBL();
#endif

signals:

#if EMERGENCY_LEAVE_BL==1
    void leaveBL();
#endif

private slots:
    void onQuit();

private:
    void scrollDownTextEdit();
    void onShowMessage(QString, QString);

    Ui::MainWindow *ui;
    hwinf *m_hw;
    Worker *m_worker;
    int const m_width;
    QTimer *m_startTimer;
    QTimer *m_exitTimer;
    bool m_progressRunning;
    int m_progressValue;
    Update *m_update;
    UpdateDcEvent::UpdateStep m_updateStep;
};
#endif // MAINWINDOW_H
