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

  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

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


#ifndef BCVALUETYPE_H
#define BCVALUETYPE_H

#include <QObject>
#include <QString>
#include <QList>
#include <QVariant>

#include <bc.h>

class BCAbstractTransmitter;
class BCValue;

using optDouble = std::optional<double>;

struct BCValueType
{

  Q_GADGET

public:

  BCValueType();
  BCValueType( QString unitLabel_, double factor_= 1.0, optDouble min_=std::nullopt, optDouble max_= std::nullopt );

  QString       unitLabel;
  double        factor;
  optDouble     min;
  optDouble     max;

  virtual QString createStringValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) const = 0;
  //virtual void   writeValue( const BCAbstractTransmitter& transmitter, BCValue& value ) = 0;

  virtual QString formatValue( uint32_t value ) const;

};



struct BCValueTypeByte : BCValueType
{
  BCValueTypeByte( QString unitLabel_, double factor_= 1.0, optDouble min_=std::nullopt, optDouble max_= std::nullopt );

  QString createStringValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) const override;
};

struct BCValueTypeWord : public BCValueType
{
  BCValueTypeWord( QString unitLabel_, double factor_= 1.0, optDouble min_=std::nullopt, optDouble max_= std::nullopt );

  QString createStringValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) const override;
};

struct BCValueTypeODO : public BCValueType
{
  BCValueTypeODO( QString unitLabel_, double factor_= 1.0, optDouble min_=std::nullopt, optDouble max_= std::nullopt );

  QString createStringValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) const override;
};

/*
struct BCValueTypeVolt : public BCValueType
{
  BCValueTypeODO( QString unitLabel_, double factor_= 1.0, optDouble min_=std::nullopt, optDouble max_= std::nullopt );

  QString createStringValue( const BCAbstractTransmitter& transmitter, uint32_t deviceID, uint8_t registerID ) override;
};
*/

  //using BCTypeVariant = std::variant<BCValueType,BCValueTypeWord,Long,Fitz,Fatz>;

// really needed?
//using BCValueTypeCRef = std::optional<std::reference_wrapper<const BCTypeVariant>>;


#endif // BCVALUETYPE_H
