#ifndef _DNAMP2_CMDL_MATERIALS_HPP_
#define _DNAMP2_CMDL_MATERIALS_HPP_

#include "../DNACommon/DNACommon.hpp"
#include "../DNACommon/GX.hpp"
#include "../DNAMP1/CMDLMaterials.hpp"
#include "DNAMP2.hpp"

namespace DataSpec
{
namespace DNAMP2
{

/* Structurally identical to DNAMP1::MaterialSet except unk0 and unk1 fields */
struct MaterialSet : BigDNA
{
    static constexpr bool OneSection() {return false;}

    DECL_DNA
    DNAMP1::MaterialSet::MaterialSetHead head;

    struct Material : BigDNA
    {
        DECL_DNA
        using Flags = DNAMP1::MaterialSet::Material::Flags;
        Flags flags;
        const Flags& getFlags() const {return flags;}

        Value<atUint32> textureCount;
        Vector<atUint32, DNA_COUNT(textureCount)> textureIdxs;
        using VAFlags = DNAMP1::MaterialSet::Material::VAFlags;
        DNAMP1::MaterialSet::Material::VAFlags vaFlags;
        const VAFlags& getVAFlags() const {return vaFlags;}
        Value<atUint32> unk0; /* MP2 only */
        Value<atUint32> unk1; /* MP2 only */
        Value<atUint32> groupIdx;

        Vector<atUint32, DNA_COUNT(flags.konstValuesEnabled())> konstCount;
        Vector<GX::Color, DNA_COUNT(flags.konstValuesEnabled() ? konstCount[0] : 0)> konstColors;

        using BlendFactor = GX::BlendFactor;
        Value<BlendFactor> blendDstFac;
        Value<BlendFactor> blendSrcFac;
        Vector<atUint32, DNA_COUNT(flags.samusReflectionIndirectTexture())> indTexSlot;

        Value<atUint32> colorChannelCount;
        Vector<DNAMP1::MaterialSet::Material::ColorChannel, DNA_COUNT(colorChannelCount)> colorChannels;

        Value<atUint32> tevStageCount;
        Vector<DNAMP1::MaterialSet::Material::TEVStage, DNA_COUNT(tevStageCount)> tevStages;
        Vector<DNAMP1::MaterialSet::Material::TEVStageTexInfo, DNA_COUNT(tevStageCount)> tevStageTexInfo;

        Value<atUint32> tcgCount;
        Vector<DNAMP1::MaterialSet::Material::TexCoordGen, DNA_COUNT(tcgCount)> tcgs;

        Value<atUint32> uvAnimsSize;
        Value<atUint32> uvAnimsCount;
        Vector<DNAMP1::MaterialSet::Material::UVAnimation, DNA_COUNT(uvAnimsCount)> uvAnims;
    };
    Vector<Material, DNA_COUNT(head.materialCount)> materials;

    static void RegisterMaterialProps(hecl::BlenderConnection::PyOutStream& out)
    {
        DNAMP1::MaterialSet::RegisterMaterialProps(out);
    }
    static void ConstructMaterial(hecl::BlenderConnection::PyOutStream& out,
                                  const MaterialSet::Material& material,
                                  unsigned groupIdx, unsigned matIdx);

    void readToBlender(hecl::BlenderConnection::PyOutStream& os,
                       const PAKRouter<PAKBridge>& pakRouter,
                       const PAKRouter<PAKBridge>::EntryType& entry,
                       unsigned setIdx)
    {
        DNACMDL::ReadMaterialSetToBlender_1_2(os, *this, pakRouter, entry, setIdx);
    }
};

}
}

#endif // _DNAMP2_CMDL_MATERIALS_HPP_