/*
 * Copyright 2024 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "data_logging_service.h"
#include "dls_list.h"

#include "console/prompt.h"

#include <inttypes.h>

static bool command_dls_list_cb(DataLoggingSession *session, void *data) {
  char buffer[80];
  prompt_send_response_fmt(buffer, sizeof(buffer),
      "session_id : %"PRIu8", tag: %"PRIu32", bytes: %"PRIu32", write_offset: %"PRIu32,
      session->comm.session_id, session->tag, session->storage.num_bytes,
      session->storage.write_offset);

  return true;
}

void command_dls_list(void) {
  dls_list_for_each_session(command_dls_list_cb, 0);
}

// Unused, comment out to avoid pulling in the string literals
#if 0
void command_dls_show(const char *id) {
  uint8_t session_id = strtol(id, NULL, 0);
  DataLoggingSession *logging_session = dls_list_find_by_session_id(session_id);

  if (logging_session == NULL) {
    prompt_send_response("LoggingSession not found");
    return;
  }

  char uuid_b[UUID_STRING_BUFFER_LENGTH];
  uuid_to_string(&logging_session->app_uuid, uuid_b);

  char buffer[80];

#define WRITE_LINE(fmt, arg) \
  prompt_send_response_fmt(buffer, sizeof(buffer), fmt, arg)

  WRITE_LINE("session_id %u", logging_session->comm.session_id);
  WRITE_LINE("uuid %s", uuid_b);
  WRITE_LINE("data state %u", logging_session->status);
  WRITE_LINE("tag %lu", logging_session->tag);
  WRITE_LINE("item type %u", logging_session->item_type);
  WRITE_LINE("item size %u", logging_session->item_size);
  WRITE_LINE("storage %lu bytes", logging_session->storage.num_bytes);
  WRITE_LINE("  r sector %u", logging_session->storage.read_sector);
  WRITE_LINE("  r offset %"PRIu32, logging_session->storage.read_offset);
  WRITE_LINE("  w sector %u", logging_session->storage.write_sector);
  WRITE_LINE("  w offset %"PRIu32, logging_session->storage.write_offset);

#undef WRITE_LINE
}
#endif

void command_dls_erase_all(void) {
  dls_clear();
}

void command_dls_send_all(void) {
  // Use this to trigger a send of all data logging data to the phone, helpful for testing
  dls_send_all_sessions();
}
