#ifndef GRAYMAPMANAGER_H
#define GRAYMAPMANAGER_H

#include <QMetaType>

#include "viewModel/utils/UsSimpleButton.h"
#include "viewModel/utils/UsList.h"
#include "viewModel/bMode/display/gray/GrayMap.h"
#include "viewModel/bMode/display/gray/KnobManager.h"
#include "viewModel/exception/VmError.h"

class GrayMapManager : public QObject
{
	Q_OBJECT

	US_PROPERTY_VIEW_ONLY(QString, grayMapTitle, "Gray Map")
	US_PROPERTY_CUSTOM_SETTER_INTERNAL(qint32, grayMap, 0)
	US_PROPERTY_CUSTOM_SETTER_INTERNAL(bool, grayMapReset, 0)

	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap0, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap1, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap2, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap3, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap4, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap5, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap6, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap7, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap8, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap9, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap10, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap11, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap12, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap13, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap14, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap15, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap16, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMap17, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMapUser1, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMapUser2, Q_NULLPTR)
	US_PROPERTY_VIEW_ONLY(GrayMap*, grayMapUser3, Q_NULLPTR)

	US_PROPERTY_VIEW_ONLY(KnobManager*, knobManager, new KnobManager)

	US_LIST(int, currentGrayMapData)

	US_SIMPLE_BUTTON(grayMapSaveAs, "Save As", "", true, true)

private:
	QString _userName;


	GrayMap* getGrayMap(qint32 index);

	void setKnobs(GrayMap* grayMap);

	QList<quint8> intListToU8List(QList<int> list);
	QList<int> u8ListToIntList(QList<quint8> list);

	quint32 getUserId();

	bool isCustomGrayMapSelected();

	void initDefaultGrayMaps();
	void initUserGrayMaps(bool throwExp);

public:
	GrayMapManager();

	void setUserName(const QString& userName);

	void init();

	QList<quint8> getGrayMapData();

	void setIndex(qint32 index);

signals:
	void grayMapReady();

//uncrustify off
public slots:
    void newCustomGrayMap(const QList<quint8>& grayMap);
	void saveGrayMap(int slotNumber);
//uncrustify on
};

Q_DECLARE_METATYPE(GrayMapManager*)

#endif //GRAYMAPMANAGER_H