#include "interface.h"
#include "message.h"

CLIENT_PAIRING* cl_create_pairing(CLIENT_PAIRING* pairing, int interface_size)
{
    if(!pairing)
    {
        pairing = (CLIENT_PAIRING*)malloc(sizeof(CLIENT_PAIRING));
        show_message_error(pairing, "Failed to allocate space for CLIENT_PAIRING");
    }
    
    pairing->interface_size = interface_size;
    
    if(interface_size)
    {
        pairing->intface = (CLIENT_INTERFACE**)malloc(sizeof(CLIENT_INTERFACE*) * interface_size);
        show_message_error(pairing->intface, "Failed to allocate space for CLIENT_INTERFACE collection");
        
        for(int i = 0; i < interface_size; i++)
            pairing->intface[i] = NULL;
    }
    else
        pairing->intface = NULL;
    
    return pairing;
}

CLIENT_INTERFACE* cl_create_interface(int background_size, int button_size, int field_size)
{
    CLIENT_INTERFACE* interface = (CLIENT_INTERFACE*)malloc(sizeof(CLIENT_INTERFACE));
    show_message_error(interface, "Failed to allocate space for CLIENT_INTERFACE");
    
    interface->header.al_font = NULL;
    interface->background_size = background_size;
    interface->button_size = button_size;
    interface->field_size = field_size;
    interface->selected = SELECTED_BUTTON;
    interface->list.al_font = NULL;
    
    if(background_size)
        interface->background = cl_create_background_pages(background_size);
    else
        interface->background = NULL;
    
    if(button_size)
        interface->button = cl_create_buttons(button_size);
    else
        interface->button = NULL;
    
    if(field_size)
        interface->field = cl_create_fields(field_size);
    else
        interface->field = NULL;

    return interface;
}

static CLIENT_BACKGROUND_PAGE** cl_create_background_pages(int size)
{
    CLIENT_BACKGROUND_PAGE** background = (CLIENT_BACKGROUND_PAGE**)malloc(sizeof(CLIENT_BACKGROUND_PAGE*) * size);
    show_message_error(background, "Failed to allocate space for CLIENT_BACKGROUND_PAGE collection");
    
    for(int i = 0; i < size; i++)
    {
        background[i] = (CLIENT_BACKGROUND_PAGE*)malloc(sizeof(CLIENT_BACKGROUND_PAGE));
        show_message_error(background[i], "Failed to allocate space for CLIENT_BACKGROUND_PAGE");
    }
    
    return background;
}

static CLIENT_BUTTON** cl_create_buttons(int size)
{
    CLIENT_BUTTON** buttons = (CLIENT_BUTTON**)malloc(sizeof(CLIENT_BUTTON*) * size);
    show_message_error(buttons, "Failed to allocate space for CLIENT_BUTTON collection");
    
    for(int i = 0; i < size; i++)
    {
        buttons[i] = (CLIENT_BUTTON*)malloc(sizeof(CLIENT_BUTTON));
        show_message_error(buttons[i], "Failed to allocate space for CLIENT_BUTTON");
        buttons[i]->al_font = NULL;
    }
    
    return buttons;
}

static CLIENT_FIELD** cl_create_fields(int size)
{
    CLIENT_FIELD** fields = (CLIENT_FIELD**)malloc(sizeof(CLIENT_FIELD*) * size);
    show_message_error(fields, "Failed to allocate space for CLIENT_FIELD collection");
    
    for(int i = 0; i < size; i++)
    {
        fields[i] = (CLIENT_FIELD*)malloc(sizeof(CLIENT_FIELD));
        show_message_error(fields[i], "Failed to allocate space for CLIENT_FIELD");
        fields[i]->al_font = NULL;
    }
    
    return fields;
}

void cl_change_selected(CLIENT_INTERFACE* interface)
{
    if(interface->selected == SELECTED_BUTTON)
    {
        interface->selected = SELECTED_FIELD;
        for(int i = 0; i < interface->button_size; i++)
            if(interface->button[i]->selected)
                interface->button[i]->selected = false;
    }
    else if(interface->selected == SELECTED_FIELD)
    {
        interface->selected = SELECTED_BUTTON;
        for(int i = 0; i < interface->field_size; i++)
            if(interface->field[i]->selected)
            {
                interface->field[i]->selected = false;
                interface->field[i]->enter = false;
            }
    }
}

void cl_free_pairing(CLIENT_PAIRING* pairing)
{
    cl_destroy_pairing(pairing);
    free(pairing);
}

void cl_destroy_pairing(CLIENT_PAIRING* pairing)
{
    for(int i = 0; i < pairing->interface_size; i++)
    {
        if(pairing->intface[i])
        {
            cl_destroy_interface(pairing->intface[i]);
        }
    }
    
    free(pairing->intface);
}

static void cl_destroy_interface(CLIENT_INTERFACE* interface)
{
    if(interface->background_size > 0)
    {
        for(int i = 0; i < interface->background_size; i++)
            free(interface->background[i]);
        free(interface->background);
    }
    
    if(interface->button_size)
    {
        for(int i = 0; i < interface->button_size; i++)
            free(interface->button[i]);
        free(interface->button);
    }
    
    if(interface->field_size)
    {
        for(int i = 0; i < interface->field_size; i++)
            free(interface->field[i]);
        free(interface->field);
    }
    
    free(interface);
}


void cl_add_interface_header(CLIENT_HEADER* header, ALLEGRO_FONT* font, int x, int y, const char* text)
{
    header->al_font = font;
    header->size = al_get_text_width(font, text);
    strncpy(header->text, text, 100);
    header->x = x;
    header->y = y;
}

void cl_add_interface_background(CLIENT_BACKGROUND_PAGE* background, CLIENT_BITMAP* bitmap, int dir_x, int dir_y, int vel_x, int vel_y, int x, int y)
{
    background->bitmap = bitmap;
    background->dir_x = dir_x;
    background->dir_y = dir_y;
    background->vel_x = vel_x;
    background->vel_y = vel_y;
    background->x = x;
    background->y = y;
}

void cl_add_interface_button(CLIENT_BUTTON* button, ALLEGRO_FONT* font, const char* text, int t_x, int t_y, int b_sx, int b_sy, int b_dx, int b_dy)
{
    button->al_font = font;
    strncpy(button->text, text, 100);
    button->t_size = al_get_text_width(font, text);
    button->t_x = t_x;
    button->t_y = t_y;
    button->selected = false;
    button->active = false;
    button->b_sx = b_sx;
    button->b_sy = b_sy;
    button->b_dx = b_dx;
    button->b_dy = b_dy;
}

void cl_add_interface_field(CLIENT_FIELD* field, ALLEGRO_FONT* font, int font_height, const char* description, int d_x, int d_y, int f_sx, int f_sy, int f_dx, int f_dy)
{
    field->al_font = font;
    strncpy(field->description, description, 100);
    field->char_size = al_get_text_width(font, "_");
    field->char_number = 0;
    field->d_x = d_x;
    field->d_y = d_y;
    field->f_sx = f_sx;
    field->f_sy = f_sy - font_height * 0.4;
    field->f_dx = f_dx + al_get_text_width(font, "_") * 20;
    field->f_dy = f_dy + font_height * 0.4;
    field->ft_x = f_sx + al_get_text_width(font, "_") * 0.4;
    field->ft_y = f_sy;
    field->selected = false;
    field->enter = false;
}

void cl_add_list_item(CLIENT_LIST_ITEM* item, int sx_item, int sy_item, int dx_item, int dy_item, int x_h, int y_h, int x_status, int y_status, int r_status)
{
    item->sx_item = sx_item;
    item->sy_item = sy_item;
    item->dx_item = dx_item;
    item->dy_item = dy_item;
    item->x_h = x_h;
    item->y_h = y_h;    
    item->x_status = x_status;
    item->y_status = y_status;
    item->r_status = r_status;
    item->selected = false;
    item->active = false;
}
