#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QVector>
#include <QLabel>
#include <QRadioButton>
#include <QPushButton>
#include <QComboBox>
#include <QtCharts/QChart>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCharts/QValueAxis>
#include <QSerialPortInfo>
#include "idatasource.h"
#include "datasimulator.h"
#include "serialsource.h"
#include "sensorcard.h"

/** @brief Ventana principal de la aplicación HMI Sensores.
 *
 *  Administra la UI con panel lateral de sensores, gráfico en tiempo real
 *  y estadísticas (MIN/MAX/AVG). Permite alternar entre simulador y
 *  fuente serial usando el patrón Strategy sobre IDataSource.
 */
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow {
    Q_OBJECT

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

private slots:
    void onDataUpdated();              ///< Actualiza UI cuando llegan datos nuevos
    void onSensorCardClicked(int index); ///< Cambia el sensor seleccionado
    void onConnectClicked();           ///< Alterna entre simulador y serial

private:
    void setupUI();                    ///< Construye el layout completo
    void setupChart();                 ///< Configura el gráfico de línea
    void switchSource(IDataSource* source); ///< Cambia la fuente de datos activa

    Ui::MainWindow* ui;

    /// Fuente de datos activa (puntero polimórfico)
    IDataSource*    m_source;
    DataSimulator*  m_simulator;
    SerialSource*   m_serial;

    /// Tarjetas visuales de sensores
    QVector<SensorCard*> m_cards;
    int m_selectedSensor;

    /// Controles de la UI
    QRadioButton* m_rbSimulator;
    QRadioButton* m_rbSerial;
    QComboBox*    m_portCombo;
    QPushButton*  m_btnConnect;
    QLabel*       m_statusLabel;

    /// Gráfico de temperatura en tiempo real
    QChart*      m_chart;
    QChartView*  m_chartView;
    QLineSeries* m_series;
    QValueAxis*  m_axisX;
    QValueAxis*  m_axisY;

    /// Estadísticas acumuladas
    QLabel* m_lblMin;
    QLabel* m_lblMax;
    QLabel* m_lblAvg;

    int m_tick;
    double m_min, m_max, m_sum;
    int m_count;
    static constexpr int MAX_POINTS = 100;
};

#endif // MAINWINDOW_H