#pragma once

#include "Actor/Actor.hpp"
#include "Actor/ActorManager.hpp"
#include "Actor/ActorProfile.hpp"
#include "Actor/Actor_Derived1.hpp"
#include "Player/PlayerGet.hpp"
#include "types.h"

typedef u32 RupeeId;
enum RupeeId_ {
    /* 0 */ RupeeId_Green,
    /* 1 */ RupeeId_Blue,
    /* 2 */ RupeeId_Red,
    /* 3 */ RupeeId_BigGreen,
    /* 4 */ RupeeId_BigRed,
    /* 5 */ RupeeId_Gold,
    /* 6 */ RupeeId_6,
    /* 7 */ RupeeId_7,
};

enum ActorRupeeState_ {
    ActorRupeeState_0  = 0,
    ActorRupeeState_1  = 1,
    ActorRupeeState_2  = 2,
    ActorRupeeState_3  = 3,
    ActorRupeeState_4  = 4,
    ActorRupeeState_5  = 5,
    ActorRupeeState_6  = 6,
    ActorRupeeState_7  = 7,
    ActorRupeeState_8  = 8,
    ActorRupeeState_9  = 9,
    ActorRupeeState_10 = 10,
    ActorRupeeState_11 = 11,
    ActorRupeeState_12 = 12,
    ActorRupeeState_Max,
};

class ActorRupee_C4 : public Actor_C4 {
public:
    ActorRupee_C4(Actor *param1);

    /* 00 */ virtual bool vfunc_00(ActorRef ref, unk32 param2) override;
    /* 04 */ virtual void vfunc_04() override;
    /* 08 */ virtual void vfunc_08() override;
    /* 0C */ virtual void vfunc_0C(unk32 param1) override;
};

class ActorRupee : public Actor {
public:
    /* 00 (base) */
    /* 94 */ u16 mUnk_94;
    /* 96 */ u16 mUnk_96;
    /* 98 */ u16 mUnk_98;
    /* 9A */ u16 mUnk_9A;
    /* 9C */ Actor_9C mUnk_9C;
    /* BC */ ActorRef mUnk_BC;
    /* C0 */ ActorRef mUnk_C0;
    /* C4 */ ActorRupee_C4 mUnk_C4;
    /* E8 */ unk32 mUnk_E8;
    /* EC */ s16 mUnk_EC;
    /* F0 */ UnkStruct_PlayerGet_ec mUnk_F0;
    /* F4 */ bool mUnk_F4;
    /* F5 */ unk8 mUnk_F5;
    /* F6 */ unk8 mUnk_F6;
    /* F7 */ unk8 mUnk_F7;
    /* F8 */

    ActorRupee();

    /* 18 */ virtual bool vfunc_18(unk32 param1) override;
    /* 20 */ virtual void vfunc_20() override;
    /* 2C */ virtual void vfunc_2C(unk32 param1) override;
    /* 4C */ virtual ~ActorRupee() override;

    void func_ov031_020e8fec();
    void func_ov031_020e9068();
    void func_ov031_020e9108();
    void func_ov031_020e91a8();
    void func_ov031_020e9234();
    void func_ov031_020e9254();
    void func_ov031_020e92e0();
    void func_ov031_020e9310();
    void func_ov031_020e9428();
    void func_ov031_020e942c();
    void func_ov031_020e9430();
    void func_ov031_020e9434();
    void func_ov031_020e9438();
    void func_ov031_020e9450();
    void func_ov031_020e94d4();
    void func_ov031_020e951c();
    void func_ov031_020e9598();
    void func_ov031_020e95ac();
    void func_ov031_020e95b0();
    void func_ov031_020e95c0();
    void func_ov031_020e9610();
    void func_ov031_020e9624();
    void func_ov031_020e9638();
    void func_ov031_020e96bc();
    void func_ov031_020e970c();
    void func_ov031_020e9740();
    void func_ov031_020e9838();
    void func_ov031_020e98c4();
    void SetState(ActorState state);
    void func_ov031_020e9b88();
    void func_ov031_020e9be8();
    bool func_ov031_020e9d54();
    void func_ov031_020e9d94();
    bool func_ov031_020e9e5c();

    static void func_ov031_020e8d2c(ActorRef *pOutRef, const VecFx32 *pPos, u32 params, u32 unk_2C, ActorRef ref);
};

class ActorProfileRupee : public ActorProfile {
public:
    /* 00 (base) */

    ActorProfileRupee();

    /* 0C */ virtual Actor *Create();

    static ActorProfileRupee *GetProfile();
};
