#pragma once

#include "MapObject/MapObject.hpp"
#include "MapObject/MapObjectProfile.hpp"
#include "Render/ModelRender.hpp"
#include "Unknown/Common.hpp"
#include "global.h"
#include "types.h"

class MapObjectSwitchStep_40 : public ModelRender {
public:
    /* 00 (base) */
    /* 60 */ unk16 mUnk_60;
    /* 62 */ bool mUnk_62;
    /* 63 */ unk8 mUnk_63;
    /* 64 */

    MapObjectSwitchStep_40();

    // data_ov000_020b36e0
    /* 00 */ virtual ~MapObjectSwitchStep_40() override {}
    /* 1C */ virtual void vfunc_1C(UnkSystem4_vfunc_1C *param1) override;

    void func_ov000_0209dde0(void);
};

class MapObjectSwitchStep : public MapObject {
public:
    /* 00 (base) */
    /* 40 */ MapObjectSwitchStep_40 mUnk_40;
    /* A4 */ UnkSystem5 mUnk_A4;
    /* C4 */ unk32 mUnk_C4;
    /* C8 */ STRUCT_PAD(0xC8, 0xE4);
    /* E4 */ u16 mUnk_E4;
    /* E6 */ u16 mUnk_E6;
    /* E8 */ unk16 mUnk_E8;
    /* EA */ unk8 mUnk_EA;
    /* EB */ unk8 mUnk_EB;
    /* EC */

    MapObjectSwitchStep();

    /* 00 */ virtual bool vfunc_00() override;
    /* 08 */ virtual void vfunc_08() override;
    /* 14 */ virtual void vfunc_14() override;
    /* 18 */ virtual void vfunc_18(s8 *param1, s8 param2) override;
    /* 20 */ virtual void vfunc_20() override;
    /* 30 */ virtual ~MapObjectSwitchStep() override;

    void func_ov000_0209dda4(void);

    void func_ov000_0209e11c(unk32 param1, unk32 param2);
    void func_ov000_0209e38c(void);
};

class MapObjectProfileSwitchStep_Base : public MapObjectProfile_Derived2 {
public:
    /* 00 (base) */
    /* D4 */ MapObject_10 mUnk_D4;

    MapObjectProfileSwitchStep_Base(MapObjectId mapObjId) :
        MapObjectProfile_Derived2(mapObjId, mapObjId) {}

    // data_ov000_020b369c (vtable)
};

class MapObjectProfileSwitchStep : public MapObjectProfileSwitchStep_Base {
public:
    /* 00 (base) */
    /* F8 */

    MapObjectProfileSwitchStep();
    ~MapObjectProfileSwitchStep() {}

    /* 00 */ virtual MapObject *Create();

    static MapObjectProfileSwitchStep *GetProfile();
};
