#ifndef HMML_H_
#define HMML_H_
#include <stddef.h>
#include <stdio.h>

// Data structures

#define HMML_CUSTOM_ATTR_COUNT 16

typedef struct {
	char* member;
	char* stream_platform;
	char* stream_username;
	char* project;
	char* title;
	char* vod_platform;
	char* id;

	char** co_hosts;
	size_t co_host_count;

	char** guests;
	size_t guest_count;

	char** annotators;
	size_t annotator_count;

	char* template;
	char* medium;

	char* custom[HMML_CUSTOM_ATTR_COUNT];

	long publication_date;
	char* output;

} HMML_VideoMetaData;

typedef struct {
	char* site;
	char* page;
	char* url;
	char* title;
	char* article;
	char* author;
	char* editor;
	char* publisher;
	char* isbn;
	int offset;
} HMML_Reference;

typedef enum {
	HMML_CATEGORY,
	HMML_MEMBER,
	HMML_PROJECT,

	HMML_MARKER_COUNT,
} HMML_MarkerType;

typedef struct {
	HMML_MarkerType type;
	char* marker;
	char* parameter;
	char* episode;
	int offset;
} HMML_Marker;

typedef struct {
	int id;
	char* author;
} HMML_Quote;

typedef struct {
	int line;
	char* time;
	char* text;
	char* author;

	HMML_Reference* references;
	size_t reference_count;

	HMML_Marker* markers;
	size_t marker_count;

	HMML_Quote quote;
	_Bool is_quote;
} HMML_Annotation;

typedef struct {
	int line;
	char* message;
} HMML_Error;

typedef struct {
	_Bool               well_formed;
	HMML_VideoMetaData metadata;
	HMML_Annotation*   annotations;
	size_t             annotation_count;
	HMML_Error         error;
} HMML_Output;

// Functions

HMML_Output hmml_parse_file (FILE* file);
void        hmml_dump       (HMML_Output* output);
void        hmml_free       (HMML_Output* output);

// Version

extern const struct HMML_Version {
	int Major, Minor, Patch;
} hmml_version;

#endif