#ifndef PRYSTRIY_H
#define PRYSTRIY_H

#include "./numbertypes.h"

#ifndef MAVKA_VERSION
#define MAVKA_VERSION "0.0.0"
#endif

typedef enum PristriyMavkyWriteToStdoutColor {
  PristriyMavkyColorReset = 0,
  PristriyMavkyColorRed = 1,
  PristriyMavkyColorGreen = 2,
  PristriyMavkyColorBlue = 3,
  PristriyMavkyColorYellow = 4,
} PristriyMavkyWriteToStdoutColor;

bool pristriy_mavky_get_version(char** data_out, size_t* size_out);

void* pristriy_mavky_malloc(size_t size);

void* pristriy_mavky_realloc(void* value, size_t new_size);

void pristriy_mavky_free(void* value);

void pristriy_mavky_write_to_stdout(char* data, size_t size);

void pristriy_mavky_write_utf8_to_stdout(PristriyMavkyWriteToStdoutColor color,
                                         char* data,
                                         size_t size);

double pristriy_mavky_double_pow(double value, double exp);
double pristriy_mavky_double_sin(double value);
double pristriy_mavky_double_cos(double value);
double pristriy_mavky_double_tan(double value);
double pristriy_mavky_double_asin(double value);
double pristriy_mavky_double_acos(double value);
double pristriy_mavky_double_atan(double value);
double pristriy_mavky_double_abs(double value);
double pristriy_mavky_double_exp(double value);
double pristriy_mavky_double_sqrt(double value);
double pristriy_mavky_double_ceil(double value);
double pristriy_mavky_double_floor(double value);
double pristriy_mavky_double_round(double value);

bool pristriy_mavky_uint64_to_str(size_t value,
                                  char** data_out,
                                  size_t* size_out);

bool pristriy_mavky_int64_to_str(ssize_t value,
                                 char** data_out,
                                 size_t* size_out);

bool pristriy_mavky_double_to_str(double value,
                                  char** data_out,
                                  size_t* size_out,
                                  ssize_t* exp_size_out);

bool pristriy_mavky_str_to_double(char* data, size_t size, double* out);

bool pristriy_mavky_get_cwd(char** data_out, size_t* size_out);

bool pristriy_mavky_get_absolute_path(char* path_data,
                                      size_t path_size,
                                      char** data_out,
                                      size_t* size_out);

bool pristriy_mavky_check_if_file_exists(char* path_data, size_t path_size);

bool pristriy_mavky_read_file(char* path_data,
                              size_t path_size,
                              char** data_out,
                              size_t* size_out);

bool pristriy_mavky_read_input_async(
    char* prefix_data,
    size_t prefix_size,
    void (*callback)(char* data, size_t data_size, bool eof, void* arg),
    void* arg,
    bool allow_history);

void* pristriy_mavky_dlopen(char* path_data, size_t path_size, int* err_out);

void* pristriy_mavky_dlsym(void* dl,
                           char* name_data,
                           size_t name_size,
                           int* err_out);

int pristriy_mavky_dlclose(void* dl);

void pristriy_mavky_exit(int code);

#endif // PRYSTRIY_H