#include "xlrusensorstable.h"

#define tab_col_00_width 90
#define tab_col_01_width 50
#define tab_col_02_width 50
#define tab_col_03_width 50
#define tab_col_04_width 50
#define tab_row_height   20

XlruSensorsTableClass::XlruSensorsTableClass(QTableWidget *_tab_sensor)
{
    tab_sensor = _tab_sensor;

    tab_sensor->setColumnCount(4);
    tab_sensor->setRowCount(0);
    tab_sensor->setColumnWidth(0, tab_col_00_width);
    tab_sensor->setColumnWidth(1, tab_col_01_width);
    tab_sensor->setColumnWidth(2, tab_col_02_width);
    tab_sensor->setColumnWidth(3, tab_col_03_width);
    //tab_sensor->setRowHeight(0,tab_row_height);
    //tab_sensor->setRowHeight(1,tab_row_height);
    //tab_sensor->setRowHeight(2,tab_row_height);

    QStringList m_TableHeader;

    m_TableHeader<<"sensor"<<"min"<<"actual"<<"max";
    tab_sensor->setHorizontalHeaderLabels(m_TableHeader);
    tab_sensor->setEditTriggers(QAbstractItemView::NoEditTriggers);
    tab_sensor->setSelectionBehavior(QAbstractItemView::SelectRows);
    tab_sensor->setSelectionMode(QAbstractItemView::SingleSelection);
    tab_sensor->setShowGrid(true);
    tab_sensor->setStyleSheet("QTableView {selection-background-color: silver;}");
}

XlruSensorsTableClass::~XlruSensorsTableClass()
{

}

//Insert a value into correct sensor and update info into tableview
void XlruSensorsTableClass::update_sensor(QString name, float value)
{
    //found sensor row for table
    int idx = findSensorName(name);

    if (idx==-1)
        return;

    //update instant value for sensor on correct row
    sensor_table *se = list_sensors[idx];

    se->value = value;

    if ((se->max==0.0f) && (se->min==0.0f))
    {
        se->max = value;
        se->min = value;
        tab_sensor->setItem(idx, 3, new QTableWidgetItem(QString::number(value, 'f', 2)));
        tab_sensor->setItem(idx, 1, new QTableWidgetItem(QString::number(value, 'f', 2)));
    }


    tab_sensor->setItem(idx, 2, new QTableWidgetItem(QString::number(value, 'f', 2)));

    //check if max/min and update
    if (se->max<value)
    {
        se->max = value;
        tab_sensor->setItem(idx, 3, new QTableWidgetItem(QString::number(value, 'f', 2)));
    }

    if (se->min>value)
    {
        se->min = value;
        tab_sensor->setItem(idx, 1, new QTableWidgetItem(QString::number(value, 'f', 2)));
    }
}

//reset min/max with last instant value to re-check the intervall
void XlruSensorsTableClass::resetMinMax()
{
    int idx = -1;
    foreach (sensor_table *s, list_sensors)
    {
        s->max = 0.0f;
        s->min = 0.0f;
        idx++;

        tab_sensor->setItem(idx,1, new QTableWidgetItem(QString::number(0.0f, 'f', 2)));
        tab_sensor->setItem(idx,3, new QTableWidgetItem(QString::number(0.0f, 'f', 2)));
    }
}

//add label for sensor configured
void XlruSensorsTableClass::initializeSensor(QStringList SensorsName)
{
    if (SensorsName.count()<1)
        return;

    for (int i = 0; i<SensorsName.count(); i++)
    {
        tab_sensor->setItem(i,0, new QTableWidgetItem(SensorsName.value(i)));

        sensor_table *newSensor = nullptr;
        newSensor->name = SensorsName.value(i);
        newSensor->max = 0.0f;
        newSensor->min = 0.0f;
        newSensor->value = 0.0f;
        list_sensors.append(newSensor);
    }
}

int XlruSensorsTableClass::findSensorName(QString _name)
{
    int idx = 0;
    foreach (sensor_table *s, list_sensors)
    {
        if (s->name == _name)
           return idx;

        idx++;
    }
    return -1;
}

void XlruSensorsTableClass::addNewSensor(QString name)
{
    int idx = findSensorName(name);
    if (idx!=-1)
    {
        //sensor just present
        return;
    }

    sensor_table *newSensor = new sensor_table();
    newSensor->name = name;
    newSensor->max = 0.0f;
    newSensor->min = 0.0f;
    newSensor->value = 0.0f;
    list_sensors.append(newSensor);

    int count = list_sensors.count();

    tab_sensor->setRowCount(count);

    tab_sensor->setItem(count-1,0, new QTableWidgetItem(newSensor->name));

}
