#ifndef _RIVE_RUNTIME_HEADER_HPP_
#define _RIVE_RUNTIME_HEADER_HPP_

#include "rive/core/binary_reader.hpp"
#include <unordered_map>

namespace rive
{
	/// Rive file runtime header. The header is fonud at the beginning of every
	/// Rive runtime file, and begins with a specific 4-byte format: "RIVE".
	/// This is followed by the major and minor version of Rive used to create
	/// the file. Finally the owner and file ids are at the end of header; these
	/// unsigned integers may be zero.
	class RuntimeHeader
	{
	private:
		static constexpr char fingerprint[] = "RIVE";

		int m_MajorVersion;
		int m_MinorVersion;
		int m_FileId;
		std::unordered_map<int, int> m_PropertyToFieldIndex;

	public:
		/// @returns the file's major version
		int majorVersion() const { return m_MajorVersion; }
		/// @returns the file's minor version
		int minorVersion() const { return m_MinorVersion; }
		/// @returns the file's id; may be zero
		int fileId() const { return m_FileId; }

		int propertyFieldId(int propertyKey) const
		{
			auto itr = m_PropertyToFieldIndex.find(propertyKey);
			if (itr == m_PropertyToFieldIndex.end())
			{
				return -1;
			}

			return itr->second;
		}

		/// Reads the header from a binary buffer/
		/// @param reader the binary reader attached to the buffer
		/// @param header a pointer to the header where the data will be stored.
		/// @returns true if the header is successfully read
		static bool read(BinaryReader& reader, RuntimeHeader& header)
		{
			for (int i = 0; i < 4; i++)
			{
				auto b = reader.readByte();
				if (fingerprint[i] != b)
				{
					return false;
				}
			}

			header.m_MajorVersion = (int)reader.readVarUint64();
			if (reader.didOverflow())
			{
				return false;
			}
			header.m_MinorVersion = (int)reader.readVarUint64();
			if (reader.didOverflow())
			{
				return false;
			}

			header.m_FileId = (int)reader.readVarUint64();

			if (reader.didOverflow())
			{
				return false;
			}

			std::vector<int> propertyKeys;
			for (int propertyKey = (int)reader.readVarUint64(); propertyKey != 0;
			     propertyKey = (int)reader.readVarUint64())
			{
				propertyKeys.push_back(propertyKey);
				if (reader.didOverflow())
				{
					return false;
				}
			}

			int currentInt = 0;
			int currentBit = 8;
			for (auto propertyKey : propertyKeys)
			{
				if (currentBit == 8)
				{
					currentInt = reader.readUint32();
					currentBit = 0;
				}
				int fieldIndex = (currentInt >> currentBit) & 3;
				header.m_PropertyToFieldIndex[propertyKey] = fieldIndex;
				currentBit += 2;
				if (reader.didOverflow())
				{
					return false;
				}
			}

			return true;
		}
	};
} // namespace rive
#endif
