#pragma once

// STL includes
#include <vector>

// Utils includes
#include <utils/ColorRgb.h>

// Hyperion includes
#include <hyperion/ColorTransform.h>

///
/// The LedColorTransform is responsible for performing color transformation from 'raw' colors
/// received as input to colors mapped to match the color-properties of the leds.
///
class MultiColorTransform
{
public:
	MultiColorTransform(const unsigned ledCnt);
	~MultiColorTransform();

	/**
	 * Adds a new ColorTransform to this MultiColorTransform
	 *
	 * @param transform The new ColorTransform (ownership is transfered)
	 */
	void addTransform(ColorTransform * transform);

	void setTransformForLed(const std::string& id, const unsigned startLed, const unsigned endLed);

	bool verifyTransforms() const;

	///
	/// Returns the identifier of all the unique ColorTransform
	///
	/// @return The list with unique id's of the ColorTransforms
	const std::vector<std::string> & getTransformIds();

	///
	/// Returns the pointer to the ColorTransform with the given id
	///
	/// @param id The identifier of the ColorTransform
	///
	/// @return The ColorTransform with the given id (or nullptr if it does not exist)
	///
	ColorTransform* getTransform(const std::string& id);

	///
	/// Performs the color transoformation from raw-color to led-color
	///
	/// @param rawColors The list with raw colors
	///
	/// @return The list with led-colors
	///
	std::vector<ColorRgb> applyTransform(const std::vector<ColorRgb>& rawColors);

private:
	/// List with transform ids
	std::vector<std::string> _transformIds;

	/// List with unique ColorTransforms
	std::vector<ColorTransform*> _transform;

	/// List with a pointer to the ColorTransform for each individual led
	std::vector<ColorTransform*> _ledTransforms;
};