/***************************************************************************

  BionxControl
  Copyright © 2025 christoph holzheuer
  christoph.holzheuer@gmail.com

  Using:

  mhs_can_drv.c
  © 2011 - 2023 by MHS-Elektronik GmbH & Co. KG, Germany
  Klaus Demlehner, klaus@mhs-elektronik.de
  @see www.mhs-elektronik.de

  Based on Bionx data type descriptions from:

  BigXionFlasher USB V 0.2.4 rev. 97
  © 2011-2013 by Thomas Koenig <info@bigxionflasher.org>
  @see www.bigxionflasher.org

  Bionx Bike Info
  © 2018 Thorsten Schmidt (tschmidt@ts-soft.de)
  @see www.ts-soft.de

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 3 of the License, or
  (at your option) any later version.
  @see https://github.com/bikemike/bionx-bikeinfo

 ***************************************************************************/


#include <QApplication>
#include <QMetaEnum>
#include <QFile>
#include <QLabel>
#include <QProgressBar>

// main.cpp
#include <QCoreApplication>
#include <QTimer>
#include <QDebug>

#include <bcmainwindow.h>
#include <bcdatavalue.h>
#include <bcdatamanager.h>

#include <variant>
#include <string>




#include <QThread>

bool setApplicationStyleSheet( QAnyStringView path )
{
  QFile styleFile( path.toString() );
  if (styleFile.open(QIODevice::ReadOnly | QIODevice::Text))
  {
    QString style = styleFile.readAll();
    qApp->setStyleSheet(style);
    styleFile.close();
    return true;
  }

  qWarning() << "Konnte Stylesheet nicht laden:" << styleFile.errorString();
  return true;
}


struct moo
{
  QString moo_str {"irgendwas"};
};

// Verschiedene Datentypen für die Sensoren
struct Temperature : public moo{ float celsius; };
struct CpuLoad     : public moo{ int percentage; };
struct Status      : public moo{ std::string message; };

// Die Variant als universeller Datencontainer
using SensorReadingPtr = std::variant<Temperature*, CpuLoad*, Status*>;



struct UIUpdateVisitor
{
  QLabel* tempLabel;
  QProgressBar* cpuBar;
  QLabel* statusLabel;

  // Überladene operator() für jeden Typ in der Variant
  double operator()(Temperature* t) const
  {
    //tempLabel->setText(QString("Temp: %1°C").arg(t.celsius, 0, 'f', 1));
    //tempLabel->setStyleSheet(t.celsius > 40 ? "color: red;" : "color: black;");
    return -1;
  }

  double operator()(CpuLoad* c) const
  {
    cpuBar->setValue(c->percentage);
    qDebug() << c->moo_str;
    return -42.0;
  }

  double operator()(const Status* s) const
  {
    //statusLabel->setText(QString::fromStdString(s.message));
    return -1;
  }
};

void onNewDataReceived(const SensorReadingPtr& data)
{
  QLabel* labelTemp = nullptr;
  QProgressBar* progressCpu = nullptr;
  QLabel* labelStatus = nullptr;

  // Wir erstellen den Visitor mit Referenzen auf unsere UI-Elemente
  UIUpdateVisitor visitor { labelTemp, progressCpu, labelStatus };

  // Die Magie: std::visit wählt zur Kompilierzeit die richtige Methode
  double result = std::visit(visitor, data);
  Q_UNUSED(result)


  Temperature myTemp{};
  SensorReadingPtr xxx{&myTemp};
  double result2 = std::visit(visitor, SensorReadingPtr{&myTemp} );
}

struct mookoo
{
  QString a="firz";
  int b=2;
  double c=1.0;
  QString hidden{"Fatz!"};
};

struct mookoo2 : public mookoo
{
  int another;
};

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  //setApplicationStyleSheet( ":/bionxcontrol.qss"_L1 );

  mookoo myMookoo{"",1,1.0};
  mookoo myMooko2{"",1};
 mookoo2*  myMooko3 = new mookoo2{{"superfitze",1},8};

  qDebug() << " --- haha: " << myMooko3->a << ": " << myMooko3->hidden;

  BCMainWindow w;
  w.show();

  return app.exec();

}
