#ifndef ConsoleButton_H
#define ConsoleButton_H

#include <QObject>
#include <QtXml>
#include <QMap>
#include <QMutex>
#include <QtConcurrent/QtConcurrent>
#include <QMetaType>

#include "model/csm/core/consoleComponent/ControlAbstract.h"
#include "model/csm/core/consoleComponent/Button.h"
#include "model/csm/core/consoleComponent/Rotary.h"
#include "model/csm/core/consoleComponent/Led.h"
#include "model/csm/dto/HidPacket.h"
#include "model/csm/utils/XmlConsoleConfigReader.h"

#define LONG_PRESS_TIME_MS 1000

/*****************************************************************************/
/**
 * @brief this class is a code vision of each console's item in real
 * @author Mohammad Mohsen Talaie
 * @details this class modifing the leds, rotary and buttons of each item
 * @date 12 jan 2021
 */
/*****************************************************************************/
class ConsoleButton : public QObject
{
    Q_OBJECT

private:
    QString _name;

    Button _push;
    Button _up;
    Button _down;
    Rotary _rotary;

    QMutex _longPressLocker;
    QList<quint8> _functionCodes;     //init inside ctor

    QList<Led_t> _ledList;

    //this list contain fuction code and corespond commands information.
    QMap<quint8, QList<CommandControl_t> > _controlCommandList;
    QMap<quint8, QList<CommandControl_t> > _controlLongPressCommandList;

    EConsole::eConsoleButtonType _ConsolebuttonType;

    void pushDownCheck(Button* btn, const HidPacket_t& data);

    void checkPushUp(Button& btn, const HidPacket_t& data);

    void longPressThread(Button* btn, const HidPacket_t& data);

    int updateControlsEnablity(const Led_t& led);

public:
    //ctor
    ConsoleButton(const QDomElement& btnElement);

    EConsole::eConsoleButtonType getConsoleButtonType() const;
    QList<quint8> getFunctionCodes();
    QString getName() const;

    void prepareControlComandList(ControlAbstract* control,
                                  const EConsole::eConsoleState& consoleState);

signals:
    void sendLedStatusToHID(const QMap<quint8, quint8>& ledStatus);
    void sendControlCommandToConsoleCore(const QList<CommandControl_t>& commands,
                                         const quint8& functionCode);
    void sendControlLongPressCommandToConsoleCore(const QList<CommandControl_t>& commands,
                                                  const quint8& functionCode);
//uncrustify off
public slots:
//uncrustify on
    void recievePush(const HidPacket_t& data);
    void recieveConsoleState(const EConsole::eConsoleState& consoleState, const QString& probType);
};

#endif //ConsoleButton_H