#ifndef __DNAMP1_PAK_HPP__
#define __DNAMP1_PAK_HPP__

#include <unordered_map>

#include <nod/DiscBase.hpp>
#include "../DNACommon/PAK.hpp"

namespace DataSpec
{
namespace DNAMP1
{

struct PAK : BigDNA
{
    bool m_useLzo;
    bool m_noShare;
    PAK(bool useLzo, bool noShare) : m_useLzo(useLzo), m_noShare(noShare) {}
    DECL_EXPLICIT_DNA

    struct NameEntry : BigDNA
    {
        DECL_DNA
        DNAFourCC type;
        UniqueID32 id;
        Value<atUint32> nameLen;
        String<DNA_COUNT(nameLen)> name;
    };

    struct Entry : BigDNA
    {
        DECL_DNA
        Value<atUint32> compressed;
        DNAFourCC type;
        UniqueID32 id;
        Value<atUint32> size;
        Value<atUint32> offset;
        UniqueResult unique;
        std::string name; /* backreferencing name for RE purposes */

        std::unique_ptr<atUint8[]> getBuffer(const nod::Node& pak, atUint64& szOut) const;
        inline PAKEntryReadStream beginReadStream(const nod::Node& pak, atUint64 off=0) const
        {
            atUint64 sz;
            std::unique_ptr<atUint8[]> buf = getBuffer(pak, sz);
            return PAKEntryReadStream(std::move(buf), sz, off);
        }
    };

    std::vector<NameEntry> m_nameEntries;
    std::unordered_map<UniqueID32, Entry> m_entries;
    std::vector<UniqueID32> m_firstEntries;
    std::unordered_map<std::string, UniqueID32> m_nameMap;

    const Entry* lookupEntry(const UniqueID32& id) const;
    const Entry* lookupEntry(std::string_view name) const;
    std::string bestEntryName(const Entry& entry, bool& named) const;

    using IDType = UniqueID32;
};

}
}

#endif // __DNAMP1_PAK_HPP__