#ifndef LEGOPLANTMANAGER_H
#define LEGOPLANTMANAGER_H

#include "decomp.h"
#include "legomain.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
	{
		// While this class exists in BETA10, it didn't have a ClassName().
		// The constructor suggests that it did not inherit from MxCore back then and did not have a VTABLE.
		// STRING: LEGO1 0x100f318c
		return "LegoPlantManager";
	}

	void Init();
	void LoadWorldInfo(LegoOmni::World p_worldId);
	void Reset(LegoOmni::World p_worldId);
	MxResult Write(LegoStorage* p_storage);
	MxResult Read(LegoStorage* p_storage);
	MxS32 GetNumPlants();
	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_basedOnMood);
	LegoPlantInfo* GetInfoArray(MxS32& p_length);
	LegoEntity* CreatePlant(MxS32 p_index, LegoWorld* p_world, LegoOmni::World p_worldId);
	MxBool DecrementCounter(LegoEntity* p_entity);
	void ScheduleAnimation(LegoEntity* p_entity, MxLong p_length);
	MxResult DetermineBoundaries();
	void ClearCounters();
	void SetInitialCounters();

	static void SetCustomizeAnimFile(const char* p_value);

	// FUNCTION: BETA10 0x1007ffa0
	static const char* GetCustomizeAnimFile() { return g_customizeAnimFile; }

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

private:
	void RemovePlant(MxS32 p_index, LegoOmni::World p_worldId);
	void AdjustHeight(MxS32 p_index);
	LegoPlantInfo* GetInfo(LegoEntity* p_entity);
	MxBool DecrementCounter(MxS32 p_index);
	void AdjustCounter(LegoEntity* p_entity, MxS32 p_adjust);

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

	LegoOmni::World m_worldId;     // 0x08
	MxBool m_boundariesDetermined; // 0x0c
	AnimEntry* m_entries[5];       // 0x10
	MxS8 m_numEntries;             // 0x24
	LegoWorld* m_world;            // 0x28
};

#endif // LEGOPLANTMANAGER_H
