#ifndef __MetaData__H
#define __MetaData__H

#include <stdbool.h>

typedef enum
{ EMetaId_None              =  0
, EMetaId_StreamName        =  1
// Metadata ids are copied from DiskSample
, EMetaId_StreamType        =  3
, EMetaId_StreamTitle       =  4
, EMetaId_StreamArtist      =  5
, EMetaId_StreamAlbum       =  6
, EMetaId_StreamStation     =  7
, EMetaId_StreamDescription =  8
, EMetaId_StreamGenre       =  9
, EMetaId_StreamComment     = 10
, EMetaId_StreamUrl         = 11
, EMetaId_StreamEncoder     = 12
, EMetaId_StreamFileType    = 13
, EMetaId_StreamMimeType    = 14
, EMetaId_StreamTrackNumber = 15
, EMetaId_StreamDate        = 16
// Additional Metadata
, EMetaId_StreamCollective  = 256
, EMetaId_StreamBox         = 257
, EMetaId_StreamBroadcaster = 258
, EMetaId_StreamOrder       = 259
, EMetaId_ModuleName        = 260
, EMetaId_ModuleHandle      = 261
} EMetaId;

// Metadata origin, highest number take priority
typedef enum
{ EMetaOrigin_Default  = 0 // Default value obtained maybe from parent container
, EMetaOrigin_FileName = 1 // Extracted from file leafname
, EMetaOrigin_Stream   = 2 // Extraced from stream while playing
, EMetaOrigin_FilePath = 3 // Extracted from file pathname
, EMetaOrigin_User     = 4 // Set by the user at the interface
} EMetaOrigin;

typedef struct MetaData
{
	EMetaId                id;
	EMetaOrigin            origin;
	const char*            data;
	unsigned int           size;
} MetaData;

typedef struct MetaList MetaList;

MetaList* throw_New_MetaList(void);
MetaList* throw_New_MetaList_Copy(const MetaList* pOld);
void Delete_MetaList(MetaList*);

int  MetaList_Count(const MetaList*);
void MetaList_Clear(MetaList*);
bool throw_MetaList_Merge(MetaList*, const MetaList* pCopy);
const MetaData* MetaList_Find(const MetaList*, EMetaId id);
const MetaData* MetaList_Get(const MetaList*, int Index);
bool throw_MetaList_SetData(MetaList*, EMetaId id, EMetaOrigin o, const void* data, unsigned int size);
bool throw_MetaList_SetText(MetaList*, EMetaId id, EMetaOrigin o, const char* data);

#endif
