#pragma once
#include "widget_elements/widget_element_i.h"

typedef struct Widget Widget;
typedef struct WidgetElement WidgetElement;

/** Allocate Widget that holds Widget Elements
 * @return Widget instance
 */
Widget* widget_alloc();

/** Free Widget
 * @note this function free allocated Widget Elements
 * @param widget Widget instance
 */
void widget_free(Widget* widget);

/** Clear Widget
 * @param widget Widget instance
 */
void widget_clear(Widget* widget);

/** Get Widget view
 * @param widget Widget instance
 * @return View instance
 */
View* widget_get_view(Widget* widget);

/** Add String Element
 * @param widget Widget instance
 * @param x - x coordinate
 * @param y - y coordinate
 * @param horizontal - Align instance
 * @param vertical - Align instance
 * @param font Font instance
 */
void widget_add_string_element(
    Widget* widget,
    uint8_t x,
    uint8_t y,
    Align horizontal,
    Align vertical,
    Font font,
    const char* text);

/** Add Button Element
 * @param widget Widget instance
 * @param button_type GuiButtonType instance
 * @param text text on allocated button
 * @param callback ButtonCallback instance
 * @param context pointer to context
 */
void widget_add_button_element(
    Widget* widget,
    GuiButtonType button_type,
    const char* text,
    ButtonCallback callback,
    void* context);

/** Add Icon Element
 * @param widget Widget instance
 * @param x - x coordinate
 * @param y - y coordinate
 * @param icon Icon instance
 */
void widget_add_icon_element(Widget* widget, uint8_t x, uint8_t y, const Icon* icon);