#ifndef LIBDNG_LIBRARY_H
#define LIBDNG_LIBRARY_H

#include <limits.h>
#include <time.h>
#include <stdint.h>
#include <stdbool.h>

#define EXPORT __attribute__((__visibility__("default")))

typedef struct {
		char *camera_make;
		char *camera_model;
		char *unique_camera_model;
		char *software;
		uint16_t orientation;
		struct tm datetime;

		// Raw image data
		uint16_t bayer_pattern_dimensions[2];
		float neutral[3];
		float analogbalance[3];
		uint8_t cfapattern[4];

		// Calibration data
		float color_matrix_1[9];
		float color_matrix_2[9];
		float forward_matrix_1[9];
		float forward_matrix_2[9];
		unsigned short illuminant_1;
		unsigned short illuminant_2;
		unsigned int hue_sat_map_dims[3];
		size_t tone_curve_length;
		float *tone_curve;
		float *hue_sat_map_data_1;
		float *hue_sat_map_data_2;

		uint16_t bit_depth;
		bool needs_repack;
} libdng_info;

#define LIBDNG_ORIENTATION_TOPLEFT 1
#define LIBDNG_ORIENTATION_TOPRIGHT 2
#define LIBDNG_ORIENTATION_BOTRIGHT 3
#define LIBDNG_ORIENTATION_BOTLEFT 4
#define LIBDNG_ORIENTATION_LEFTTOP 5
#define LIBDNG_ORIENTATION_RIGHTTOP 6
#define LIBDNG_ORIENTATION_RIGHTBOT 7
#define LIBDNG_ORIENTATION_LEFTBOT 8

EXPORT int
libdng_init();

EXPORT void
libdng_new(libdng_info *dng);

EXPORT void
libdng_free(libdng_info *dng);

EXPORT int
libdng_set_mode_from_name(libdng_info *dng, const char *name);

EXPORT int
libdng_set_mode_from_pixfmt(libdng_info *dng, uint32_t pixfmt);

EXPORT int
libdng_set_make_model(libdng_info *dng, const char *make, const char *model);

EXPORT int
libdng_set_software(libdng_info *dng, const char *software);

EXPORT int
libdng_set_datetime(libdng_info *dng, struct tm time);

EXPORT int
libdng_set_datetime_now(libdng_info *dng);

EXPORT int
libdng_set_orientation(libdng_info *dng, uint16_t orientation);

EXPORT int
libdng_set_neutral(libdng_info *dng, float red, float green, float blue);

EXPORT int
libdng_set_analog_balance(libdng_info *dng, float red, float green, float blue);

EXPORT int
libdng_load_calibration_file(libdng_info *dng, const char *path);

EXPORT int
libdng_write(libdng_info *dng, const char *path, unsigned int width, unsigned int height, const uint8_t *data,
	size_t length);

#endif //LIBDNG_LIBRARY_H