#include <assert.h>  // assert
#include <stdio.h>   // fprintf, stderr
#include <stdlib.h>  // size_t
#include "hex.h"
#include "median.h"

#define TEST_SIZE 1024 * 1024 * 256  // 256M
// A sinple main routine meant as an example,
// and also to unit test most of the intersting
// functions of the median module.
int main(int argc, char* argv[]) {
  // Call suggest buffer size to determine the size of the buffer
  // we need to build the data structure.
  size_t n = 0;

  // Allocate the buffer of the required size. And then
  // initialize it (median_init_buffer).
  assert(median_suggest_buffer_size(.001, TEST_SIZE, &n) == MEDIAN_OK);
  void* b = malloc(n);
  assert(b);
  median_buffer_t buf;
  assert(median_init_buffer(b, n, .001, TEST_SIZE, &buf) == MEDIAN_OK);

  // Initialize the spare buffer.
  assert(median_suggest_scratch_buffer_size(buf, &n) == MEDIAN_OK);
  void* s = malloc(n);
  assert(s);
  median_scratch_buffer_t scratch;
  assert(median_init_scratch_buffer(s, n, buf, &scratch) == MEDIAN_OK);

  // Insert some data.
  for (median_data_t i = 1; i < TEST_SIZE; i++) {  // 1G
    assert(median_insert_data(buf, i, scratch) == MEDIAN_OK);
  }

  // Dump the buffer.
  assert(median_dump_stderr(buf) == MEDIAN_OK);

  median_data_t median;
  assert(median_output_median(buf, &median, scratch) == MEDIAN_OK);
  fprintf(stderr, "And the median is %x\n", (unsigned)median);

  size_t obs = 0;
  assert(median_suggest_json_string_size(buf, &obs) == MEDIAN_OK);
  void* ob = malloc(obs);
  assert(ob);
  median_json_string_t mob;
  assert(median_init_json_string(ob, obs, buf, &mob) == MEDIAN_OK);

  // Free up the resources.
  assert(median_deinit_buffer(buf) == MEDIAN_OK);
  assert(median_deinit_scratch_buffer(scratch) == MEDIAN_OK);
  assert(median_deinit_json_string(mob) == MEDIAN_OK);

  // Free up the malloc'd space.
  free(b);
  free(s);
  free(ob);

  // All done, return 0
  return 0;
}
