#ifndef TOWTRACK_H
#define TOWTRACK_H

#include "decomp.h"
#include "islepathactor.h"
#include "legostate.h"

class MxEndActionNotificationParam;

// VTABLE: LEGO1 0x100d7fd8
// VTABLE: BETA10 0x101bfee0
// SIZE 0x28
class TowTrackMissionState : public LegoState {
public:
	enum {
		e_none = 0,
		e_started = 1,
		e_hookedUp = 2,
		e_hookingUp = 3,
	};

	TowTrackMissionState();

	// FUNCTION: LEGO1 0x1004dde0
	// FUNCTION: BETA10 0x100f8720
	MxResult Serialize(LegoStorage* p_storage) override
	{
		LegoState::Serialize(p_storage);

		if (p_storage->IsReadMode()) {
			p_storage->ReadS16(m_peScore);
			p_storage->ReadS16(m_maScore);
			p_storage->ReadS16(m_paScore);
			p_storage->ReadS16(m_niScore);
			p_storage->ReadS16(m_laScore);
			p_storage->ReadS16(m_peHighScore);
			p_storage->ReadS16(m_maHighScore);
			p_storage->ReadS16(m_paHighScore);
			p_storage->ReadS16(m_niHighScore);
			p_storage->ReadS16(m_laHighScore);
		}
		else if (p_storage->IsWriteMode()) {
			p_storage->WriteS16(m_peScore);
			p_storage->WriteS16(m_maScore);
			p_storage->WriteS16(m_paScore);
			p_storage->WriteS16(m_niScore);
			p_storage->WriteS16(m_laScore);
			p_storage->WriteS16(m_peHighScore);
			p_storage->WriteS16(m_maHighScore);
			p_storage->WriteS16(m_paHighScore);
			p_storage->WriteS16(m_niHighScore);
			p_storage->WriteS16(m_laHighScore);
		}

		return SUCCESS;
	} // vtable+0x1c

	// FUNCTION: LEGO1 0x1004dfa0
	// FUNCTION: BETA10 0x100f8920
	const char* ClassName() const override // vtable+0x0c
	{
		// STRING: LEGO1 0x100f00bc
		return "TowTrackMissionState";
	}

	// FUNCTION: LEGO1 0x1004dfb0
	MxBool IsA(const char* p_name) const override // vtable+0x10
	{
		return !strcmp(p_name, TowTrackMissionState::ClassName()) || LegoState::IsA(p_name);
	}

	// FUNCTION: BETA10 0x10088890
	MxS16 GetHighScore(MxU8 p_actorId)
	{
		switch (p_actorId) {
		case LegoActor::c_pepper:
			return m_peHighScore;
			break;
		case LegoActor::c_mama:
			return m_maHighScore;
			break;
		case LegoActor::c_papa:
			return m_paHighScore;
			break;
		case LegoActor::c_nick:
			return m_niHighScore;
			break;
		case LegoActor::c_laura:
			return m_laHighScore;
			break;
		}

		return 0;
	}

	// FUNCTION: BETA10 0x100f8530
	void UpdateScore(ScoreColor p_score, MxS16 p_actorId)
	{
		switch (p_actorId) {
		case LegoActor::c_pepper:
			m_peScore = p_score;
			if (m_peHighScore < p_score) {
				m_peHighScore = p_score;
			}
			break;
		case LegoActor::c_mama:
			m_maScore = p_score;
			if (m_maHighScore < p_score) {
				m_maHighScore = p_score;
			}
			break;
		case LegoActor::c_papa:
			m_paScore = p_score;
			if (m_paHighScore < p_score) {
				m_paHighScore = p_score;
			}
			break;
		case LegoActor::c_nick:
			m_niScore = p_score;
			if (m_niHighScore < p_score) {
				m_niHighScore = p_score;
			}
			break;
		case LegoActor::c_laura:
			m_laScore = p_score;
			if (m_laHighScore < p_score) {
				m_laHighScore = p_score;
			}
			break;
		}
	}

	// SYNTHETIC: LEGO1 0x1004e060
	// TowTrackMissionState::`scalar deleting destructor'

	MxU32 m_state;          // 0x08
	MxLong m_startTime;     // 0x0c
	MxBool m_takingTooLong; // 0x10
	MxS16 m_peScore;        // 0x12
	MxS16 m_maScore;        // 0x14
	MxS16 m_paScore;        // 0x16
	MxS16 m_niScore;        // 0x18
	MxS16 m_laScore;        // 0x1a
	MxS16 m_peHighScore;    // 0x1c
	MxS16 m_maHighScore;    // 0x1e
	MxS16 m_paHighScore;    // 0x20
	MxS16 m_niHighScore;    // 0x22
	MxS16 m_laHighScore;    // 0x24
};

// VTABLE: LEGO1 0x100d7ee0
// VTABLE: BETA10 0x101bfdc0
// SIZE 0x180
class TowTrack : public IslePathActor {
public:
	TowTrack();
	~TowTrack() override;

	// FUNCTION: LEGO1 0x1004c7c0
	// FUNCTION: BETA10 0x100f8440
	const char* ClassName() const override // vtable+0x0c
	{
		// STRING: LEGO1 0x100f03b8
		return "TowTrack";
	}

	// FUNCTION: LEGO1 0x1004c7d0
	MxBool IsA(const char* p_name) const override // vtable+0x10
	{
		return !strcmp(p_name, TowTrack::ClassName()) || IslePathActor::IsA(p_name);
	}

	MxLong Notify(MxParam& p_param) override;                                    // vtable+0x04
	MxResult Create(MxDSAction& p_dsAction) override;                            // vtable+0x18
	void Animate(float p_time) override;                                         // vtable+0x70
	MxLong HandleClick() override;                                               // vtable+0xcc
	MxLong HandleControl(LegoControlManagerNotificationParam& p_param) override; // vtable+0xd4
	MxLong HandleEndAnim(LegoEndAnimNotificationParam& p_param) override;        // vtable+0xd8
	MxLong HandlePathStruct(LegoPathStructNotificationParam& p_param) override;  // vtable+0xdc
	void Exit() override;                                                        // vtable+0xe4
	virtual MxLong HandleEndAction(MxEndActionNotificationParam& p_param);       // vtable+0xf0

	void CreateState();
	void Init();
	void ActivateSceneActions();
	void StopActions();
	void Reset();

	// SYNTHETIC: LEGO1 0x1004c950
	// TowTrack::`scalar deleting destructor'

private:
	void Leave();
	void PlayFinalAnimation(IsleScript::Script p_objectId);
	void PlayActorAnimation(IsleScript::Script p_objectId);
	void PlayAction(IsleScript::Script p_objectId);

	undefined4 m_unused0x160;           // 0x160
	TowTrackMissionState* m_state;      // 0x164
	MxS16 m_unused0x168;                // 0x168
	MxS16 m_actorId;                    // 0x16a
	MxS16 m_treeBlockageTriggered;      // 0x16c
	MxS16 m_speedComplaintTriggered;    // 0x16e
	IsleScript::Script m_lastAction;    // 0x170
	IsleScript::Script m_lastAnimation; // 0x174
	MxFloat m_fuel;                     // 0x178
	MxFloat m_time;                     // 0x17c
};

#endif // TOWTRACK_H
