#pragma once
#include "foundation/types.h"
#include "nx/nxstring.h"
#include "nu/PtrDeque.h"
#include "nu/ByteWriter.h"
#include "nu/ByteReader.h"
namespace APEv2
{
	enum
	{
		ITEM_KEY_COMPARE_CASE_INSENSITIVE = 0,
		ITEM_KEY_COMPARE_CASE_SENSITIVE = 1,
	};

	class Item : public nu::PtrDequeNode
	{
	public:
		Item();
		~Item();

		/* If successful, puts incremented data pointer in new_data, and new data size remaining in new_len */
		int Read(bytereader_t byte_reader);

		int Encode(bytewriter_t byte_writer) const;
		size_t EncodeSize() const;

		bool IsReadOnly();
		bool KeyMatch(const char *key, int compare=ITEM_KEY_COMPARE_CASE_INSENSITIVE);
		int Get(const void **data, size_t *len) const;
		int GetKey(const char **tag) const;
		int Set(nx_string_t value);
		int Set(const void *data, size_t len, int dataType);
		int SetKey(const char *tag);
		int New(size_t datalen, int data_type, void **bytes);
		uint32_t GetFlags() const;

	private:
		uint32_t flags;
		char *key;
		void *value;
		uint32_t len;
	};
}