#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 = reader.readVarUintAs<int>();
        if (reader.didOverflow())
        {
            return false;
        }
        header.m_MinorVersion = reader.readVarUintAs<int>();
        if (reader.didOverflow())
        {
            return false;
        }

        header.m_FileId = reader.readVarUintAs<int>();

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

        std::vector<int> propertyKeys;
        for (int propertyKey = reader.readVarUintAs<int>(); propertyKey != 0;
             propertyKey = reader.readVarUintAs<int>())
        {
            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
