#ifndef ARC_NCURSES_ELEMENT_H_
#define ARC_NCURSES_ELEMENT_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include "view.h"
#include "arc/std/string.h"
#include "arc/std/bool.h"
#include "arc/math/point.h"

/**
 * @brief
*/
typedef struct ARC_ConsoleElement ARC_ConsoleElement;

/**
 * @brief
*/
typedef void (*ARC_ConsoleElement_RenderFn)(ARC_ConsoleView *view, ARC_ConsoleElement *element);

/**
 * @brief
*/
typedef struct ARC_ConsoleElement {
    uint32_t type;
    uint8_t flags;
    ARC_String *string;

    ARC_Point pos;

    ARC_ConsoleElement_RenderFn renderFn;
} ARC_ConsoleElement;

/**
 * @brief
*/
#define ARC_CONSOLE_ELEMENT_FLAG_NONE       0b00000000
#define ARC_CONSOLE_ELEMENT_FLAG_SELECTABLE 0b00000001
#define ARC_CONSOLE_ELEMENT_FLAG_SELECTED   0b00000010

/**
 * @brief
*/
void ARC_ConsoleElement_Create(ARC_ConsoleElement **element, uint32_t type, uint8_t flags, ARC_String *string, ARC_Point pos, ARC_ConsoleElement_RenderFn renderFn);

/**
 * @brief
*/
void ARC_ConsoleElement_Destroy(ARC_ConsoleElement *element);

/**
 * @brief
*/
void ARC_ConsoleElement_DefaultRenderFn(ARC_ConsoleView *view, ARC_ConsoleElement *element);

/**
 * @brief
 *
 * @param
*/
ARC_Bool ARC_ConsoleElement_IsSelectable(ARC_ConsoleElement *element);

/**
 * @brief
 *
 * @param
*/
void ARC_ConsoleElement_SetSelected(ARC_ConsoleElement *element, ARC_Bool selected);

/**
 * @brief
*/
void ARC_ConsoleElement_ToggleSelected(ARC_ConsoleElement *element);

#endif //!ARC_CONSOLE_ELEMENT_H_
