#include "cJSON.h"
#include "esp_http_server.h"
#include "esp_system.h"
#include "esp_timer.h"

#include "types.hpp"

internal void restart_timer_callback(void *arg) { esp_restart(); }

internal esp_err_t api_system_reboot_handler(httpd_req_t *req)
{
  httpd_resp_set_type(req, "application/json");
  httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");

  cJSON *root = cJSON_CreateObject();
  cJSON_AddStringToObject(root, "status", "rebooting");

  const char *response_text = cJSON_Print(root);
  httpd_resp_sendstr(req, response_text);

  free((void *)response_text);
  cJSON_Delete(root);

  const esp_timer_create_args_t restart_timer_args = {
      .callback = &restart_timer_callback,
      .arg = (void *)0,
      .dispatch_method = ESP_TIMER_TASK,
      .name = "restart_timer",
      .skip_unhandled_events = false};
  esp_timer_handle_t restart_timer;
  esp_timer_create(&restart_timer_args, &restart_timer);

  // Schedule reboot 1 second (in microseconds) from now to allow HTTP response
  // to flush
  esp_timer_start_once(restart_timer, 1'000'000);

  return ESP_OK;
}

internal const httpd_uri_t api_system_reboot_uri = {
    .uri = "/api/system/reboot",
    .method = HTTP_POST,
    .handler = api_system_reboot_handler,
    .user_ctx = NULL};
