#ifndef UTILS_H
#define UTILS_H

float interpolate(float lag, float from, float to);

typedef unsigned int IntColor;

namespace Color
{
    constexpr IntColor getColor(unsigned int r, unsigned int g, unsigned int b)
    {
        return ((r & 0xFF) << 0) | ((g & 0xFF) << 8) | ((b & 0xFF) << 16) | 0xFF000000;
    }

    constexpr IntColor getDarkerColor(unsigned int r, unsigned int g, unsigned int b)
    {
        r *= 0.5;
        g *= 0.5;
        b *= 0.5;
        return ((r & 0xFF) << 0) | ((g & 0xFF) << 8) | ((b & 0xFF) << 16) | 0xFF000000;
    }

    constexpr int COLOR_AMOUNT = 16;
    
    constexpr IntColor COLORS[COLOR_AMOUNT]
    {
        getColor(0, 0, 0),
        getColor(0, 0, 170),
        getColor(0, 170, 0),
        getColor(0, 170, 170),
        getColor(170, 0, 0),
        getColor(170, 0, 170),
        getColor(255, 170, 0),
        getColor(170, 170, 170),
        getColor(85, 85, 85),
        getColor(85, 85, 255),
        getColor(85, 255, 85),
        getColor(85, 255, 255),
        getColor(255, 85, 85),
        getColor(255, 85, 255),
        getColor(255, 255, 85),
        getColor(255, 255, 255)
    };

    constexpr IntColor DARK_COLORS[COLOR_AMOUNT]
    {
        getDarkerColor(0, 0, 0),
        getDarkerColor(0, 0, 170),
        getDarkerColor(0, 170, 0),
        getDarkerColor(0, 170, 170),
        getDarkerColor(170, 0, 0),
        getDarkerColor(170, 0, 170),
        getDarkerColor(255, 170, 0),
        getDarkerColor(170, 170, 170),
        getDarkerColor(85, 85, 85),
        getDarkerColor(85, 85, 255),
        getDarkerColor(85, 255, 85),
        getDarkerColor(85, 255, 255),
        getDarkerColor(255, 85, 85),
        getDarkerColor(255, 85, 255),
        getDarkerColor(255, 255, 85),
        getDarkerColor(255, 255, 255)
    };
}

#endif