#ifndef ACTOR_H
#define ACTOR_H
#include <ISXDK.h>
#include <memory>

#include "LSObject.h"
#include "Point3f.h"


class Actor {
public:
    explicit Actor(const shared_ptr<LSObject> &obj) : lsObject(obj) {
    }

    // General
    u_long Id() const;

    std::string Name() const;

    std::string LastName() const;

    int HealthPercentage() const;

    int PowerPercentage() const;

    int Level() const;

    int EffectiveLevel() const;

    u_int TintFlags() const;

    std::string VisualVariant() const;

    std::string Mood() const;

    std::string CurrentAnimation() const;

    std::string Overlay() const;

    std::string Aura() const;

    std::string Gender() const;

    std::string Race() const;

    std::string Class() const;

    std::string Guild() const;

    std::string Type() const;

    std::string SuffixTitle() const;

    std::string ConColor() const;

    std::string RawConColor() const;

    std::string FactionStanding() const;

    int Faction() const;

    Actor Target() const;

    Actor Pet() const;

    // Threat
    int ThreatToPet() const;

    int ThreatToMe() const;

    int ThreatToNext() const;

    // Location
    float Distance() const;

    // Note: This is the distance using three dimensions, which is what the EQ2 client primarily uses for determining ability ranges, etc.
    float Distance2d() const;

    float X() const;

    float Y() const;

    float Z() const;

    Point3f Location() const;

    float Heading() const;

    string HeadingToAsString() const;

    Point3f Velocity() const;

    bool CheckCollision() const;

    bool CheckCollision(const float toX, const float toY, const float toZ) const;

    float TargetRingRadius() const;

    float CollisionRadius() const;

    float CollisionScale() const;

    u_long WhoFollowingId() const;

    string WhoFollowingName() const;

    float Speed() const;

    float SwimmingSpeedModifier() const;

    // Booleans
    bool InMyGroup() const;

    bool Interactable() const;

    bool OnFlyingMount() const;

    bool FlyingUsingMount() const;

    bool IsChest() const;

    bool IsBanker() const;

    bool IsMerchant() const;

    bool IsAPet() const;

    bool IsMyPet() const;

    bool IsAfk() const;

    bool IsLfw() const;

    bool IsLfg() const;

    bool IsLinkdead() const;

    bool IsCamping() const;

    bool IsLocked() const;

    bool IsAggro() const;

    bool IsSolo() const;

    bool IsHeroic() const;

    bool IsEpic() const;

    bool IsNamed() const;

    bool IsSwimming() const;

    bool IsEncounterBroken() const;

    bool IsInvisible() const;

    bool IsClimbing() const;

    bool IsJumping() const;

    bool IsFalling() const;

    bool IsFD() const;

    bool IsDead() const;

    bool IsRooted() const;

    bool CanTurn() const;

    // The following members are mutually exclusive.
    bool InCombatMode() const;

    bool IsCrouching() const;

    bool IsSitting() const;

    // The following members are mutually exclusive.
    bool OnCarpet() const;

    bool OnHorse() const;

    bool ONGriphon() const;

    // The following members are mutually exclusive.
    bool IsRunning() const;

    bool IsWalking() const;

    bool IsSprinting() const;

    // The following members are mutually exclusive.
    bool IsBackingUp() const;

    bool IsStrafingLeft() const;

    bool IsStrafingRight() const;

    bool IsIdle() const;

    // Encounter Information
    int EncounterSize() const;

    /// \brief Returns the encounter difficulty as a range of -3 to 3. (-3 = three down arrows, 0 = no arrows, 3 = three up arrows)
    int Difficulty() const;

    /// \brief Given another actor's ID#, returns TRUE if this actor is in the same encounter.
    int IsInSameEncounter(const u_long id) const;

    int RaidSize() const;

    string TagTargetNumber() const;

    string TagTargetIcon() const;

    // Effects
    int EffectCount() const;

    /// \brief Using a Lavishscript Query String allows script writers to search based on ANY of the datatypes members.
    // ActorEffect Effect(query, string) const;

    // Methods
    void DoubleClick() const;

    void WaypointTo() const;

    void DoFace() const;

    void DoTarget() const;

    void AddLocation(const string &notes) const;

    void DeleteLocation() const;

    void RequesteffectsInfo() const;

protected:
    const shared_ptr<LSObject> lsObject;
};


#endif //ACTOR_H
