#ifndef _CCOLLISIONACTOR
#define _CCOLLISIONACTOR

#include "types.h"

#include "MetroidPrime/CDamageVulnerability.hpp"
#include "MetroidPrime/CHealthInfo.hpp"
#include "MetroidPrime/CPhysicsActor.hpp"

#include "rstl/single_ptr.hpp"

class CCollidableOBBTreeGroupContainer;
class CCollidableOBBTreeGroup;
class CCollidableAABox;
class CCollidableSphere;

class CCollisionActor : public CPhysicsActor {
public:
  enum EPrimitiveType {
    kPT_OBBTreeGroup,
    kPT_AABox,
    kPT_Sphere,
  };

  CCollisionActor(TUniqueId uid, TAreaId areaId, TUniqueId owner, const CVector3f& extent,
                  const CVector3f& center, bool active, float mass);
  CCollisionActor(TUniqueId uid, TAreaId areaId, TUniqueId owner, const CVector3f& boxSize,
                  bool active, float mass);
  CCollisionActor(TUniqueId uid, TAreaId areaId, TUniqueId owner, bool active, float radius,
                  float mass);

  // CEntity
  ~CCollisionActor() override;
  void Accept(IVisitor& visitor) override;
  void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override;

  // CActor
  CHealthInfo* HealthInfo(CStateManager&) override;
  const CDamageVulnerability* GetDamageVulnerability() const override;
  const CDamageVulnerability* GetDamageVulnerability(const CVector3f&, const CVector3f&,
                                                     const CDamageInfo&) const override;
  rstl::optional_object< CAABox > GetTouchBounds() const override;
  void Touch(CActor&, CStateManager&) override;
  CVector3f GetOrbitPosition(const CStateManager&) const override;
  CVector3f GetScanObjectIndicatorPosition(const CStateManager&) const override;
  EWeaponCollisionResponseTypes GetCollisionResponseType(const CVector3f&, const CVector3f&,
                                                         const CWeaponMode&,
                                                         int) const override;
  void OnScanStateChange(EScanState, CStateManager&) override;

  // CPhysicsActor
  CTransform4f GetPrimitiveTransform() const override;

private:
  EPrimitiveType x258_primitiveType;
  TUniqueId x25c_owner;
  CVector3f x260_boxSize;
  CVector3f x26c_center;
  rstl::single_ptr< CCollidableOBBTreeGroupContainer > x278_obbContainer;
  rstl::single_ptr< CCollidableOBBTreeGroup > x27c_obbTreeGroupPrimitive;
  rstl::single_ptr< CCollidableAABox > x280_aaboxPrimitive;
  rstl::single_ptr< CCollidableSphere > x284_spherePrimitive;
  float x288_sphereRadius;
  CHealthInfo x28c_healthInfo;
  CDamageVulnerability x294_damageVuln;
  TUniqueId x2fc_lastTouched;
  EWeaponCollisionResponseTypes x300_responseType;
  CVector3f x304_extendedTouchBounds;
};

#endif // _CCOLLISIONACTOR
