#include <erl_nif.h>
#include <secp256k1.h>
#include <string.h>
#include <assert.h>

#include "random.h"

static secp256k1_context *ctx = NULL;

static int
load(ErlNifEnv *env, void **priv, ERL_NIF_TERM load_info)
{
  int return_val;
  unsigned char randomize[32];
  ctx = secp256k1_context_create(SECP256K1_CONTEXT_NONE);
  fill_random(randomize, sizeof(randomize));
  return_val = secp256k1_context_randomize(ctx, randomize);
  assert(return_val);
  return 0;
}

static int
upgrade(ErlNifEnv *env, void **priv, void **old_priv, ERL_NIF_TERM load_info)
{
  return 0;
}

static void
unload(ErlNifEnv *env, void *priv)
{
  secp256k1_context_destroy(ctx);
  return;
}

static ERL_NIF_TERM
error_result(ErlNifEnv *env, char *error_msg)
{
  return enif_make_tuple2(env, enif_make_atom(env, "error"), enif_make_string(env, error_msg, ERL_NIF_LATIN1));
}

/*static ERL_NIF_TERM*/
/*ok_result(ErlNifEnv *env, ERL_NIF_TERM *r)*/
/*{*/
/*  return enif_make_tuple2(env, enif_make_atom(env, "ok"), *r);*/
/*}*/
