/**
 * @file color.hpp
 * @brief Gestión de colores de la paleta Amstrad CPC
 */

#pragma once

#include <SDL3/SDL.h>

#include <string>

/**
 * @class Color
 * @brief Clase para gestionar los colores de la paleta Amstrad CPC
 *
 * La paleta del Amstrad CPC tiene 27 colores únicos organizados en un sistema
 * de 3 niveles de intensidad (0, 128, 255) para cada componente RGB.
 */
class Color {
   public:
    /**
     * @enum Cpc
     * @brief Índices de los colores de la paleta Amstrad CPC
     *
     * Los nombres corresponden a los colores oficiales documentados por Amstrad.
     * El índice 0 está reservado para transparencia.
     */
    enum class Cpc : Uint8 {
        // Transparente (índice 0)
        CLEAR = 0,  // Nota: No usar "TRANSPARENT" - colisiona con macro de Windows

        // Negros y azules (R=0)
        BLACK = 1,        // 0, 0, 0
        BLUE = 2,         // 0, 0, 128
        BRIGHT_BLUE = 3,  // 0, 0, 255

        // Rojos y magentas (G=0)
        RED = 4,             // 128, 0, 0
        MAGENTA = 5,         // 128, 0, 128
        MAUVE = 6,           // 128, 0, 255
        BRIGHT_RED = 7,      // 255, 0, 0
        PURPLE = 8,          // 255, 0, 128
        BRIGHT_MAGENTA = 9,  // 255, 0, 255

        // Verdes y cianes (R=0, G>0)
        GREEN = 10,     // 0, 128, 0
        CYAN = 11,      // 0, 128, 128
        SKY_BLUE = 12,  // 0, 128, 255

        // Amarillos y blancos medios (G=128)
        YELLOW = 13,       // 128, 128, 0
        WHITE = 14,        // 128, 128, 128
        PASTEL_BLUE = 15,  // 128, 128, 255

        // Naranjas y rosas (R=255, G=128)
        ORANGE = 16,          // 255, 128, 0
        PINK = 17,            // 255, 128, 128
        PASTEL_MAGENTA = 18,  // 255, 128, 255

        // Verdes brillantes (G=255)
        BRIGHT_GREEN = 19,  // 0, 255, 0
        SEA_GREEN = 20,     // 0, 255, 128
        BRIGHT_CYAN = 21,   // 0, 255, 255

        // Limas y pasteles verdes (G=255)
        LIME = 22,          // 128, 255, 0
        PASTEL_GREEN = 23,  // 128, 255, 128
        PASTEL_CYAN = 24,   // 128, 255, 255

        // Amarillos brillantes y blancos (R=255, G=255)
        BRIGHT_YELLOW = 25,  // 255, 255, 0
        PASTEL_YELLOW = 26,  // 255, 255, 128
        BRIGHT_WHITE = 27    // 255, 255, 255
    };

    /**
     * @brief Obtiene el índice de paleta de un color CPC
     * @param color Color del enum Cpc
     * @return Índice de paleta (Uint8)
     */
    static constexpr auto getIndex(Cpc color) -> Uint8 {  // NOLINT(readability-identifier-naming)
        return static_cast<Uint8>(color);
    }

    /**
     * @brief Convierte un nombre de color (string) a índice de paleta
     * @param name Nombre del color en minúsculas (ej: "cyan", "bright_blue")
     * @return Índice de paleta, o 1 (BLACK) si no se encuentra
     */
    static auto fromString(const std::string& name) -> Uint8;
};
