#pragma once

#include <stdio.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>
#include "base.h"


ALLEGRO_FONT* font;

typedef struct
{
    Model M;
    int radius;
    char* text;
    ALLEGRO_FONT* font;
    int text_align;
} Button;

typedef struct
{
    Model M;
    int radius;
    char* text;
    ALLEGRO_BITMAP* image;
    int flip;
} ImageButton;


void view_button(Button* btn)
{
    // Button background
    if (btn->M.clicked == CLICKED)
        al_draw_filled_rounded_rectangle(btn->M.x, btn->M.y, btn->M.x + btn->M.width, btn->M.y+btn->M.height, btn->radius, btn->radius, btn->M.C.primary_variant_color);
    else
        al_draw_filled_rounded_rectangle(btn->M.x, btn->M.y, btn->M.x + btn->M.width, btn->M.y+btn->M.height, btn->radius, btn->radius, btn->M.C.primary_color);
    // Button border
    al_draw_rounded_rectangle(btn->M.x, btn->M.y, btn->M.x + btn->M.width, btn->M.y+btn->M.height, btn->radius, btn->radius, btn->M.C.border_color, btn->M.border);
    // Button text
    al_draw_text(btn->font, btn->M.C.on_primary_color, btn->M.x + btn->M.padding, btn->M.y + btn->M.padding, btn->text_align, btn->text);
}

void view_image_button(ImageButton* btn)
{
    // Button background
    al_draw_filled_rounded_rectangle(btn->M.x, btn->M.y, btn->M.x + btn->M.width, btn->M.y+btn->M.height, btn->radius, btn->radius, btn->M.C.primary_color);
    // Button border
    al_draw_rounded_rectangle(btn->M.x, btn->M.y, btn->M.x + btn->M.width, btn->M.y+btn->M.height, btn->radius, btn->radius, btn->M.C.border_color, btn->M.border);
    // Button image
    al_draw_bitmap(btn->image, btn->M.x, btn->M.y, btn->flip);
}

void controller_click_down(Model* btn, ALLEGRO_MOUSE_STATE* state)
{
    printf("Mouse x = %d \nMouse y = %d", state->x, state->y);
    if (state != NULL)
    if (state->buttons & 1)
        if (state->x > btn->x &&
            state->y > btn->y &&
            state->x < btn->x + btn->width &&
            state->y < btn->y + btn->height) {
            btn->clicked = PRESSED;
            printf("controller_click_down\n");
            }
}
void controller_click_up(Model* btn, ALLEGRO_MOUSE_STATE* state)
{
    if (state != NULL)
    if (state->buttons & 1)
        if (state->x > btn->x &&
            state->y > btn->y &&
            state->x < btn->x + btn->width &&
            state->y < btn->y + btn->height) {
            btn->clicked = CLICKED;
            printf("controller_click_up\n");
        }
}

/*void controller_image_button(ImageButton* btn)
{
    ALLEGRO_MOUSE_STATE state;
    al_get_mouse_state(&state);
    if (state.buttons & 1)
        if (state.x > btn->M.x &&
            state.y > btn->M.y &&
            state.x < btn->M.x + btn->M.width &&
            state.y < btn->M.y + btn->M.height)
            btn->clicked = true;
}*/

void init_buttons(Model* parent, Button* btns, int length, ALLEGRO_FONT* font)
{
    materialize();

    Model BUTTON;
    int positionin = parent->x + parent->padding;
    int b_width = 20;
    int endin = parent->y + parent->padding;
    int b_height = 20;
    char temp_text[] = "a";
    printf("parent pointer size : %d", sizeof(Model*));

    for (int i=0; i<length; i++)
    {
        BUTTON.id = i;
        BUTTON.C = MATERIAL;
        BUTTON.x = positionin;
        BUTTON.y = endin;
        BUTTON.width = b_width;
        BUTTON.height = b_height;
        BUTTON.offset_x = b_width;
        BUTTON.offset_y = b_height;
        BUTTON.padding = 6;
        BUTTON.border = 2;
        BUTTON.visibility = VISIBLE;
        BUTTON.clicked = UNSET;

        btns[i].M = BUTTON;
        btns[i].radius = 2;
        temp_text[0] = 'a'+i;
        btns[i].text = malloc(2);
        strcpy(btns[i].text, temp_text);
        btns[i].text_align = ALLEGRO_ALIGN_LEFT;
        btns[i].font = font;

        if ((b_width)*2 + positionin + parent->padding <= parent->width+parent->x) {
            positionin += b_width + parent->padding;
        } else {
            endin += b_height + parent->padding;
            positionin = parent->x + parent->padding;
        }
    }
}

void init_image_buttons(Model* parent, ImageButton* btns, int length)
{
    font = al_create_builtin_font();
    materialize();

    Model BUTTON;
    int positionin = parent->x + parent->padding;
    int b_width = 20;
    int endin = parent->y + parent->padding;
    int b_height = 20;
    char filename[] = "../images/Sprites/flatLight/flatLight00.png";
    printf("parent pointer size : %d", sizeof(Model*));

    for (int i=0; i<length; i++)
    {
        BUTTON.id = i;
        BUTTON.C = MATERIAL;
        BUTTON.x = positionin;
        BUTTON.y = endin;
        BUTTON.width = b_width;
        BUTTON.height = b_height;
        BUTTON.offset_x = b_width;
        BUTTON.offset_y = b_height;
        BUTTON.padding = 6;
        BUTTON.border = 2;
        BUTTON.visibility = VISIBLE;
        BUTTON.clicked = UNSET;

        btns[i].M = BUTTON;
        btns[i].radius = 2;
        filename[38] = '0'+i;
        printf("Load image %s\n", filename);
        btns[i].image = al_load_bitmap(filename);
        btns[i].flip = ALLEGRO_FLIP_HORIZONTAL;

        if ((b_width)*2 + positionin + parent->padding <= parent->width+parent->x) {
            positionin += b_width + parent->padding;
        } else {
            endin += b_height + parent->padding;
            positionin = parent->x + parent->padding;
        }
    }
}
