#ifndef D_A_OBJ_CATDOOR_H
#define D_A_OBJ_CATDOOR_H

#include "f_op/f_op_actor_mng.h"
#include "d/d_bg_w.h"

class daObjCatDoor_Door_c {
public:
    /* 0x00 */ J3DModel* pmodel;
    /* 0x04 */ dBgW bgw;
    /* 0xe0 */ Mtx mtx;
    /* 0xf4 */ s16 angle;
};

class daObjCatDoor_Attr_c {
public:
    /* 0x0 */ s16 speed;
    /* 0x2 */ s16 decay_rate;
};

class daObjCatDoor_Hio_c : public mDoHIO_entry_c {
public:
    daObjCatDoor_Hio_c();
    ~daObjCatDoor_Hio_c();

    void genMessage(JORMContext*);

    void ct();
    void dt();
    void default_set();

    /* 0x8 */ int field_0x8;
    /* 0xC */ daObjCatDoor_Attr_c m_attr;
};

/**
 * @ingroup actors-objects
 * @class daObjCatDoor_c
 * @brief Cat Door
 *
 * @details
 *
 */
class daObjCatDoor_c : public fopAc_ac_c {
public:
    inline ~daObjCatDoor_c();

    const daObjCatDoor_Attr_c* attr() const;
    void initBaseMtx();
    void setBaseMtx();
    void calcOpen();

    u8 getSwitchNo() { return fopAcM_GetParam(this); }

    inline int createHeap();
    inline int draw();
    inline int execute();
    inline int create();
    inline void create_init();

    void _toDoorOpened() {
        mDoor1.angle = 0x8800;
        mDoor2.angle = 0x7800;
        setBaseMtx();
        fopAcM_onSwitch(this, getSwitchNo());
    }

    void setDoorOpen() {
        mRotSpeed = attr()->decay_rate;
        dBgW* bgw1 = &mDoor1.bgw;
        if (bgw1->ChkUsed()) {
            dComIfG_Bgsp().Release(bgw1);
        }

        dBgW* bgw2 = &mDoor2.bgw;
        if (bgw2->ChkUsed()) {
            dComIfG_Bgsp().Release(bgw2);
        }

        Z2GetAudioMgr()->seStart(Z2SE_OBJ_GZ_NE_DOOR_OP, &current.pos, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
    }

private:
    /* 0x568 */ request_of_phase_process_class mPhaseReq;
    /* 0x570 */ daObjCatDoor_Door_c mDoor1;
    /* 0x660 */ daObjCatDoor_Door_c mDoor2;
    /* 0x760 */ Mtx mMtx;
    /* 0x790 */ s16 mRotSpeed;

public:
    static const daObjCatDoor_Attr_c M_attr;
};

#endif /* D_A_OBJ_CATDOOR_H */
