#pragma once
#include <allegro5/allegro_color.h>

typedef enum {BASE, PAGE, TOOLS, APP_BAR} Id;
typedef enum {VISIBLE, HIDDEN} Visibility;
typedef enum {PRESSED, CLICKED, UNSET} Click;

typedef struct
{
    ALLEGRO_COLOR primary_color;
    ALLEGRO_COLOR primary_variant_color;
    ALLEGRO_COLOR secondary_color;
    ALLEGRO_COLOR secondary_variant_color;
    ALLEGRO_COLOR on_primary_color;
    ALLEGRO_COLOR on_secondary_color;
    ALLEGRO_COLOR error_color;
    ALLEGRO_COLOR bg_color;
    ALLEGRO_COLOR border_color;
} Theme;

// Class PRIMARY = {{51, 51, 255, 255}, {255, 204, 204, 255}, {0, 0, 255, 255}};
// Class SECONDARY = {{0, 255, 0, 0}, {102, 255, 51, 0}, {204, 255, 153, 0}};
Theme MATERIAL = {{98, 0, 238, 0}, {55, 0, 179, 0}, {3, 218, 198, 0}, {1, 135, 134, 0}, {255, 255, 255, 0}, {0, 0, 0, 0}, {176, 0, 32, 0}, {255, 255, 255, 0}, {187, 154, 252, 0}};
Theme LIGHT = {{204, 255, 255, 0}, {102, 204, 255, 0}, {255, 204, 255, 0}, {255, 204, 204, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {255, 102, 102, 0}, {255, 255, 204}, {255, 255, 255, 0}};
Theme DARK = {{187, 134, 252, 0}, {55, 0, 179, 0}, {3, 218, 198, 0}, {3, 218, 198, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {207, 102, 121, 0}, {18, 18, 18, 0}, {33, 33, 33, 0}};

typedef struct
{
    Id id;
    Theme C;

    int x, y;
    int width, height;
    int offset_x, offset_y;

    int padding;
    int border;

    Visibility visibility;
    Click clicked;

} Model;

void materialize()
{
    MATERIAL.primary_color = al_map_rgb(98, 0, 238);
    MATERIAL.primary_variant_color = al_map_rgb(55, 0, 179);
    MATERIAL.secondary_color = al_map_rgb(3, 218, 198);
    MATERIAL.secondary_variant_color = al_map_rgb(1, 135, 134);
    MATERIAL.on_primary_color = al_map_rgb(255, 255, 255);
    MATERIAL.on_secondary_color = al_map_rgb(0, 0, 0);
    MATERIAL.error_color = al_map_rgb(176, 0, 32);
    MATERIAL.bg_color = al_map_rgb(255, 255, 255);
    MATERIAL.border_color = al_map_rgb(187, 154, 252);
}

void darken()
{
    DARK.primary_color = al_map_rgb(187, 134, 252);
    DARK.primary_variant_color = al_map_rgb(55, 0, 179);
    DARK.secondary_color = al_map_rgb(3, 218, 198);
    DARK.secondary_variant_color = al_map_rgb(3, 218, 198);
    DARK.on_primary_color = al_map_rgb(0, 0, 0);
    DARK.on_secondary_color = al_map_rgb(0, 0, 0);
    DARK.error_color = al_map_rgb(207, 102, 121);
    DARK.bg_color = al_map_rgb(18, 18, 18);
    DARK.border_color = al_map_rgb(33, 33, 33);
}

void lighten()
{
    LIGHT.primary_color = al_map_rgb(204, 255, 255);
    LIGHT.primary_variant_color = al_map_rgb(102, 204, 255);
    LIGHT.secondary_color = al_map_rgb(255, 204, 255);
    LIGHT.secondary_variant_color = al_map_rgb(255, 204, 204);
    LIGHT.on_primary_color = al_map_rgb(0, 0, 0);
    LIGHT.on_secondary_color = al_map_rgb(0, 0, 0);
    LIGHT.error_color = al_map_rgb(255, 102, 102);
    LIGHT.bg_color = al_map_rgb(255, 255, 204);
    LIGHT.border_color = al_map_rgb(255, 255, 255);
}
