/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*-  */
/**
 * @file      Items.hpp
 * @since     Aug 20, 2025
 * @author    Patricio A. Rossi (MeduZa)
 *
 * @copyright Copyright © 2018 - 2026 Patricio A. Rossi (MeduZa)
 *
 * @copyright LEDSpicer 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.
 *
 * @copyright LEDSpicer is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * @copyright You should have received a copy of the GNU General Public License along
 * with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#include "utilities/Color.hpp"
#include "utilities/Error.hpp"

#pragma once

namespace LEDSpicer::Devices {

using Utilities::Color;

/**
 * Helper base class to unify elements and groups.
 */
struct Items {

	/// Stores the desired color.
	const Color* color;

	/// Stores the filter to be used when applying the color.
	const Color::Filters filter;

	/// Stores the position in a list if necessary.
	const uint16_t pos;

	/// Deleted to enforce initialization of color, filter, and pos.
	Items() = delete;
	Items(const Color* color, Color::Filters filter, uint16_t pos) : color(color), filter(filter), pos(pos) {}
	Items(const Items& item)  : color(item.color), filter(item.filter), pos(item.pos) {}
	Items(Items&& item) : color(std::move(item.color)), filter(std::move(item.filter)), pos(std::move(item.pos)) {}

	virtual ~Items() = default;

	virtual string getName() const = 0;
	virtual void process(uint8_t percent, Color::Filters* filterOverride) const = 0;
};

using ItemPtrUMap = unordered_map<string, Items*>;

} // namespace

