#ifndef ADCGRAPHDIALOG_H
#define ADCGRAPHDIALOG_H

#include <QDialog>
#include <QTimer>
#include <QVector>
#include <QtCharts>
#include <QModbusClient>

QT_CHARTS_USE_NAMESPACE

// Forward declaration
class QModbusClient;

namespace Ui {
class AdcGraphDialog;
}

class AdcGraphDialog : public QDialog
{
    Q_OBJECT

public:
    explicit AdcGraphDialog(QModbusClient *modbusDevice, QWidget *parent = nullptr);
    ~AdcGraphDialog();

    void setTENumber(int boardID, int teNumber);
    void setModbusDevice(QModbusClient *device);
    void startGraph(int boardId, int teNumber);
    void stopGraph();
    void setTimeout(int timeout);
    void readyClose();

signals:
    void dialogClosed();

protected:
    void closeEvent(QCloseEvent *event) override {
        stopGraph();
        event->accept();
        emit dialogClosed();
        QDialog::closeEvent(event);
    }

private slots:
    void on_teNumberChanged(int value);
    void onUpdateTimer();
    void onReadReady();
    void onStableIndicesReady();
    void on_closeBtn_clicked();
    void on_registerCountChanged(int value);
    void on_rangeApplyClicked();

private:
    Ui::AdcGraphDialog *ui;
    QModbusClient *m_modbusDevice;
    QTimer *m_updateTimer;
    int m_boardId;
    int m_boardAddress;
    int m_teNumber;
    int m_timeout;

    // Калибровочные значения
    double m_adcZero;
    double m_adcOneVolt;

    // Для отображения стабильного участка
    QLineSeries *m_stableStartLine;
    QLineSeries *m_stableEndLine;
    int m_stableStartIndex;
    int m_stableEndIndex;

    // Данные графика
    QLineSeries *m_series;
    QValueAxis *m_axisX;
    QValueAxis *m_axisY;
    QChart *m_chart;  // Добавить указатель на chart

    // Управление диапазоном регистров
    int m_startAddress;
    int m_registerCount;

    void updateStatistics();
    void readAdcDataAndIndices();
    void onCombinedDataReady();
    void updateStatisticsWithStableInfo();
    void updateYAxisRange(double minVoltage, double maxVoltage);
    void setupRangeControls();
    void updateGraphRange();
    void readStableIndices();
    void updateStableLines();
    void readCalibrationValues();
    void readAdcBuffer();
    double convertAdcToVoltage(quint16 adcValue);
};

#endif // ADCGRAPHDIALOG_H
