#ifndef D_A_OBJ_MIRROR_6POLE_H
#define D_A_OBJ_MIRROR_6POLE_H

#include "d/d_com_inf_game.h"

class daObjMirror6Pole_c;
typedef void (daObjMirror6Pole_c::*actionFunc)();

/**
 * @ingroup actors-objects
 * @class daObjMirror6Pole_c
 * @brief Twilight Mirror Pole
 *
 * @details
 *
 */
class daObjMirror6Pole_c : public fopAc_ac_c {
public:
    enum Mode_e {
        MODE_WAIT_e,
        MODE_DEMO_e,
        MODE_MAX_e,
    };

    void initWait();
    void executeWait();
    void initDemo();
    void executeDemo();
    inline void setBaseMtx();
    inline void initBaseMtx();
    inline void create_init();
    static int createHeapCallBack(fopAc_ac_c* i_this);
    int CreateHeap();

    inline ~daObjMirror6Pole_c();

    inline int execute();
    inline int create();
    inline int draw();

    u8 getSwitchNo() { return (fopAcM_GetParam(this) >> 8) & 0xFF; }

    void setAnmSpeed(f32 speed) { mpBck->setPlaySpeed(speed); }

    bool isSwitch() {
        return (fopAcM_isSwitch(this, getSwitchNo()) ||
                /* dSv_event_flag_c::F_0361 - Arbiter's Grounds - Spun the spinning pillars */
                dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[361]) ||
                /* dSv_event_flag_c::F_0354 - Cutscene - [cutscene] Mirror complete */
                dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[354])) != false;
    }

    inline void setAction(Mode_e i_action);
    inline void callInit();
    inline void callExecute();

    static DUSK_GAME_DATA const actionFunc ActionTable[][2];

    /* 0x568 */ J3DModel* mpModel;
    /* 0x56C */ mDoExt_bckAnm* mpBck;
    /* 0x570 */ request_of_phase_process_class mPhase;
    /* 0x578 */ actionFunc* mAction;
    /* 0x57C */ Mode_e mMode;
};

STATIC_ASSERT(sizeof(daObjMirror6Pole_c) == 0x580);

#endif /* D_A_OBJ_MIRROR_6POLE_H */
