#ifndef TWOELEVEN_HELPERS_H
#define TWOELEVEN_HELPERS_H

#ifdef __cplusplus
extern "C" {
#endif

/*********************
 *      INCLUDES
 *********************/
#include "lvgl.h"

/*********************
 *      DEFINES
 *********************/

#define ELEVENTWO_BG_COLOR             lv_color_hex(0xb3a397)
#define ELEVENTWO_TEXT_BLACK_COLOR     lv_color_hex(0x6c635b)
#define ELEVENTWO_TEXT_WHITE_COLOR     lv_color_hex(0xf8f5f0)
#define ELEVENTWO_NUMBER_EMPTY_COLOR   lv_color_hex(0xc7b9ac)
#define ELEVENTWO_NUMBER_2_COLOR       lv_color_hex(0xeee4da)
#define ELEVENTWO_NUMBER_4_COLOR       lv_color_hex(0xede0c8)
#define ELEVENTWO_NUMBER_8_COLOR       lv_color_hex(0xf2b179)
#define ELEVENTWO_NUMBER_16_COLOR      lv_color_hex(0xf59563)
#define ELEVENTWO_NUMBER_32_COLOR      lv_color_hex(0xf67c5f)
#define ELEVENTWO_NUMBER_64_COLOR      lv_color_hex(0xf75f3b)
#define ELEVENTWO_NUMBER_128_COLOR     lv_color_hex(0xedcf72)
#define ELEVENTWO_NUMBER_256_COLOR     lv_color_hex(0xedcc61)
#define ELEVENTWO_NUMBER_512_COLOR     lv_color_hex(0xedc850)
#define ELEVENTWO_NUMBER_1024_COLOR    lv_color_hex(0xedc53f)
#define ELEVENTWO_NUMBER_2048_COLOR    lv_color_hex(0xedc22e)

/**********************
 *      TYPEDEFS
 **********************/
/**
 * @brief Struct for 2048 game state
 */
struct twoeleven_t {
    lv_obj_t * btnm;
    uint16_t score;
    uint16_t map_count;
    uint16_t matrix_size;
    uint16_t **matrix;
    char ** btnm_map;
    bool game_over;
};

typedef struct twoeleven_t twoeleven_t;

/***********************
 * FUNCTION PROTOTYPES
 **********************/
/**
 * @brief Get the color for a given tile value
 */
lv_color_t get_num_color(uint16_t num);

/**
 * @brief Count empty cells in the matrix
 */
uint8_t count_empty(uint16_t matrix_size, const uint16_t **matrix);

/**
 * @brief Find if any adjacent pairs exist (for move possibility)
 */
bool find_pair_down(uint16_t matrix_size, const uint16_t **matrix);

/**
 * @brief Rotate the matrix 90 degrees clockwise (in-place)
 *        Used for move logic
 */
void rotate_matrix(uint16_t matrix_size, uint16_t **matrix);

/**
 * @brief Slide and merge a single row/column
 */
bool slide_array(uint16_t * score, uint16_t matrix_size, uint16_t *array);

/**
 * @brief Update the button map with current matrix values
 */
void update_btnm_map(uint16_t matrix_size, char ** btnm_map, const uint16_t **matrix);

#ifdef __cplusplus
} /*extern "C"*/
#endif

#endif /*TWOELEVEN_HELPERS_H*/