#ifndef LEGOPLANTMANAGER_H
#define LEGOPLANTMANAGER_H

#include "decomp.h"
#include "mxcore.h"

class LegoEntity;
class LegoPathBoundary;
struct LegoPlantInfo;
class LegoROI;
class LegoStorage;
class LegoWorld;

// VTABLE: LEGO1 0x100d6758
// SIZE 0x2c
class LegoPlantManager : public MxCore {
public:
	// SIZE 0x0c
	struct AnimEntry {
		LegoEntity* m_entity; // 0x00
		LegoROI* m_roi;       // 0x04
		MxLong m_time;        // 0x08
	};

	LegoPlantManager();
	~LegoPlantManager() override; // vtable+0x00

	MxResult Tickle() override; // vtable+0x08

	// FUNCTION: LEGO1 0x10026290
	const char* ClassName() const override // vtable+0x0c
	{
		// STRING: LEGO1 0x100f318c
		return "LegoPlantManager";
	}

	void Init();
	void LoadWorldInfo(MxS32 p_worldId);
	void Reset(MxS32 p_worldId);
	MxResult Write(LegoStorage* p_storage);
	MxResult Read(LegoStorage* p_storage);
	MxBool SwitchColor(LegoEntity* p_entity);
	MxBool SwitchVariant(LegoEntity* p_entity);
	MxBool SwitchSound(LegoEntity* p_entity);
	MxBool SwitchMove(LegoEntity* p_entity);
	MxBool SwitchMood(LegoEntity* p_entity);
	MxU32 GetAnimationId(LegoEntity* p_entity);
	MxU32 GetSoundId(LegoEntity* p_entity, MxBool p_state);
	MxBool FUN_10026c50(LegoEntity* p_entity);
	void ScheduleAnimation(LegoEntity* p_entity, MxLong p_length);
	void FUN_10027120();

	static void SetCustomizeAnimFile(const char* p_value);
	static const char* GetCustomizeAnimFile() { return g_customizeAnimFile; }

	// SYNTHETIC: LEGO1 0x100262a0
	// LegoPlantManager::`scalar deleting destructor'

private:
	LegoEntity* CreatePlant(MxS32 p_index, LegoWorld* p_world, MxS32 p_worldId);
	void RemovePlant(MxS32 p_index, MxS32 p_worldId);
	void FUN_10026860(MxS32 p_index);
	LegoPlantInfo* GetInfo(LegoEntity* p_entity);
	MxBool FUN_10026c80(MxS32 p_index);
	void FUN_100271b0(LegoEntity* p_entity, MxS32 p_adjust);

	static char* g_customizeAnimFile;
	static MxS32 g_maxMove[4];
	static MxU32 g_maxSound;

	MxS32 m_worldId;         // 0x08
	undefined m_unk0x0c;     // 0x0c
	AnimEntry* m_entries[5]; // 0x10
	MxS8 m_numEntries;       // 0x24
	LegoWorld* m_world;      // 0x28
};

#endif // LEGOPLANTMANAGER_H
