#ifndef _CSCRIPTCAMERAHINT
#define _CSCRIPTCAMERAHINT

#include "MetroidPrime/CActor.hpp"
#include "MetroidPrime/Cameras/CBallCamera.hpp"
#include "MetroidPrime/Cameras/CCameraOverrideInfo.hpp"
#include "MetroidPrime/TGameTypes.hpp"

#include "Kyoto/Math/CTransform4f.hpp"

#include "rstl/reserved_vector.hpp"

class CCameraSpring;

class CScriptCameraHint : public CActor {
public:
  CScriptCameraHint(TUniqueId uid, const rstl::string& name, const CEntityInfo& info,
                    const CTransform4f& xf, bool active, int priority,
                    CBallCamera::EBallCameraBehaviour behavior, int overrideFlags, float minDist,
                    float maxDist, float backwardsDist, const CVector3f& lookAtOffset,
                    const CVector3f& chaseLookAtOffset, const CVector3f& ballToCam, float fov,
                    float attitudeRange, float azimuthRange, float anglePerSecond,
                    float clampVelRange, float clampRotRange, float elevation,
                    float interpolateTime, float clampVelTime, float controlInterpDur);

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

  TUniqueId GetSenderId() const;
  void ClearSenders();
  void AddSender(TUniqueId uid);
  void RemoveSender(TUniqueId uid, CStateManager& mgr);
  void CheckLegacyConnections(CStateManager& mgr);

  const CCameraOverrideInfo& GetInfo() const { return mOverrideInfo; } // Not real?
  uint GetOverrideFlags() const { return mOverrideInfo.mOverrideFlags; }
  CBallCamera::EBallCameraBehaviour GetBehaviourType() const { return mOverrideInfo.mBehaviour; }
  int GetPriority() const { return mPriority; }
  TUniqueId GetDelegatedCameraId() const { return mDelegatedCameraId; }
  // OverrideCameraInfo__17CScriptCameraHintFP11CBallCamera

  uint GetSenderCount() const { return mSenders.size(); }
  bool GetInactive() const { return mInactive; }

private:
  int mPriority;
  CCameraOverrideInfo mOverrideInfo;
  rstl::reserved_vector< TUniqueId, 8 > mSenders;
  TUniqueId mDelegatedCameraId;
  bool mInactive;
  CTransform4f mOrigXf;
};
CHECK_SIZEOF(CScriptCameraHint, 0x198)

#endif // _CSCRIPTCAMERAHINT
