#include "esp_lcd_panel_ops.h"
#include "lcd_display_drv.h"
#include "log.h"
#include "events/ui_engineer_setting_screen_event.h"
#include "events/ui_main_screen_event.h"
#include "events/ui_menu_screen_event.h"
#include "events/ui_mgmt.h"
#include "events/ui_product_test_screen_event.h"
#include "events/ui_user_setting_screen_event.h"
#include "events/ui_wifi_screen_event.h"
#include "rtos_drv.h"
#include "system_freertos_define.h"
#include "ui.h"

/* 30s返回主界面 */
#define SCREEN_RETURN_TIMEOUT_MS ((uint32_t)30000)
/* 定时1s刷新任务 */
#define EVENT_TIMEOUT_MS ((uint32_t)1000)

/* TODO: June6 以下参数暂时为缓存, 理想状态获取应用后端数据 */
typedef union {
  struct {
    /* 第一次亮屏标志: 假, 真(false, true) */
    uint8_t FirstScreenOn : 1;
    /* 保留 */
    uint8_t reserved : 7;
  } bits;
  uint8_t value;
} Flag_t;

static const char* TAG = "ui_events";

/**************************************************内核相关********************************************
 */
/**
 * @brief lvgl obj delete
 *
 * @param target
 * @details 删除 LVGL 的对象
 */
void lvgl_obj_delete(lv_obj_t** target) {
  if (*target == NULL) {
    USER_LOGE(TAG, "lvgl_obj_delete null");
    goto End;
  }
  lv_obj_remove_event_cb(*target, NULL);
  lv_obj_remove_style_all(*target);
  lv_obj_del(*target);
  *target = NULL;

End:
  return;
}

/**
 * @brief Initialize ui events server.
 *
 * @param core_num
 */
void ui_events_server_init(uint8_t core_num) {
  /* FIXME: June6 Fix it */
  /* Enter critical zone */
  // taskENTER_CRITICAL((void *)NULL);
  /* 定时刷新任务 */
#if CONFIG_CHIP_DUAL_CORE
  if (update_screen_content_task_handler == NULL) {
    update_screen_content_task_handler = xTaskCreateStaticPinnedToCore(
        (TaskFunction_t)update_screen_content_task, UPDATE_SCREEN_CONTENT_TASK,
        UPDATE_SCREEN_CONTENT_STK_SIZE, (void*)NULL,
        UPDATE_SCREEN_CONTENT_TASK_PRIO,
        update_screen_content_stack_task_buffer,
        &update_screen_content_task_buffer, core_num);
    if (update_screen_content_task_handler == NULL) {
      USER_LOGE(TAG, "update_screen_content_task_handler create failed");
      goto End;
    }
  }

#else
  if (update_screen_content_task_handler == NULL) {
    update_screen_content_task_handler = xTaskCreateStatic(
        (TaskFunction_t)update_screen_content_task, UPDATE_SCREEN_CONTENT_TASK,
        UPDATE_SCREEN_CONTENT_STK_SIZE, (void*)NULL,
        UPDATE_SCREEN_CONTENT_TASK_PRIO,
        update_screen_content_stack_task_buffer,
        &update_screen_content_task_buffer);
    if (update_screen_content_task_handler == NULL) {
      USER_LOGE(TAG, "update_screen_content_task_handler create failed");
      goto End;
    }
  }
#endif
  /* FIXME: June6 Fix it */
  // if (ret != pdPASS) {
  //   /* Exit critical zone */
  //   taskEXIT_CRITICAL((void *)NULL);
  //   goto End;
  // }

End:
  return;
}

/**
 * @brief Uart rx task.
 *
 * @param pvParameters
 */
void update_screen_content_task(void* pvParameters) {
  for (;;) {
    if (lvgl_mutex_semaphore_handler != NULL)
      /* 获取互斥锁, 其他任务将阻塞直到互斥锁被释放 */
      xSemaphoreTake(lvgl_mutex_semaphore_handler, portMAX_DELAY);
    if (lvgl_mutex_semaphore_handler != NULL)
      /* 释放互斥锁, 以允许其他任务访问LVGL资源 */
      xSemaphoreGive(lvgl_mutex_semaphore_handler);
    /* 执行周期 */
    vTaskDelay(pdMS_TO_TICKS(UPDATE_SCREEN_CONTENT_TASK_PERIOD_MS));
  }
}
