//
// Created by marob on 12/20/2023.
//

#include "Actor.h"


u_long Actor::Id() const {
    return static_cast<u_long>(this->lsObject->GetMember("ID").Int64);
}

std::string Actor::Name() const {
    return this->lsObject->GetMember("Name").CharPtr;
}

std::string Actor::LastName() const {
    return this->lsObject->GetMember("LastName").CharPtr;
}

int Actor::HealthPercentage() const {
    return this->lsObject->GetMember("Health").Int;
}

int Actor::PowerPercentage() const {
    return this->lsObject->GetMember("Power").Int;
}

int Actor::Level() const {
    return this->lsObject->GetMember("Level").Int;
}

int Actor::EffectiveLevel() const {
    return this->lsObject->GetMember("EffectiveLevel").Int;
}

u_int Actor::TintFlags() const {
    return this->lsObject->GetMember("TintFlags").Int;
}

std::string Actor::VisualVariant() const {
    return {this->lsObject->GetMember("VisualVariant").CharPtr};
}

std::string Actor::Mood() const {
    return {this->lsObject->GetMember("Mood").CharPtr};
}

std::string Actor::CurrentAnimation() const {
    return {this->lsObject->GetMember("CurrentAnimation").CharPtr};
}

std::string Actor::Overlay() const {
    return {this->lsObject->GetMember("Overlay").CharPtr};
}

std::string Actor::Aura() const {
    return {this->lsObject->GetMember("Aura").CharPtr};
}

std::string Actor::Guild() const {
    return {this->lsObject->GetMember("Guild").CharPtr};
}

std::string Actor::Type() const {
    return {this->lsObject->GetMember("Type").CharPtr};
}

std::string Actor::SuffixTitle() const {
    return {this->lsObject->GetMember("SuffixTitle").CharPtr};
}

std::string Actor::ConColor() const {
    return {this->lsObject->GetMember("ConColor").CharPtr};
}

std::string Actor::RawConColor() const {
    // TODO: Modify to accept a parameter & pass in the string 'raw'
    return {this->lsObject->GetMember("RawConColor").CharPtr};
}

std::string Actor::FactionStanding() const {
    return {this->lsObject->GetMember("FactionStanding").CharPtr};
}

int Actor::Faction() const {
    return this->lsObject->GetMember("Faction").Int;
}

Actor Actor::Target() const {
    return Actor(make_shared<LSObject>(LSObject(this->lsObject->GetMember("Target"))));
}

Actor Actor::Pet() const {
    return Actor(make_shared<LSObject>(LSObject(this->lsObject->GetMember("Pet"))));
}

int Actor::ThreatToPet() const {
    return this->lsObject->GetMember("ThreatToPet").Int;
}

int Actor::ThreatToMe() const {
    return this->lsObject->GetMember("ThreatToMe").Int;
}

int Actor::ThreatToNext() const {
    return this->lsObject->GetMember("ThreatToNext").Int;
}

float Actor::Distance() const {
    return this->lsObject->GetMember("Distance").Float;
}

float Actor::Distance2d() const {
    return this->lsObject->GetMember("Distance2D").Float;
}

float Actor::X() const {
    return this->lsObject->GetMember("X").Float;
}

float Actor::Y() const {
    return this->lsObject->GetMember("Y").Float;
}

float Actor::Z() const {
    return this->lsObject->GetMember("Z").Float;
}

std::string Actor::Race() const {
    return {this->lsObject->GetMember("Race").CharPtr};
}

std::string Actor::Class() const {
    return {this->lsObject->GetMember("Class").CharPtr};
}

std::string Actor::Gender() const {
    return {this->lsObject->GetMember("Gender").CharPtr};
}

Point3f Actor::Location() const {
    return Point3f(make_shared<LSObject>(LSObject(this->lsObject->GetMember("Location"))));
}

float Actor::Heading() const {
    return this->lsObject->GetMember("Heading").Float;
}

string Actor::HeadingToAsString() const {
    return this->lsObject->GetMember("HeadingTo", "AsString").CharPtr;
}

Point3f Actor::Velocity() const {
    return Point3f(make_shared<LSObject>(LSObject(this->lsObject->GetMember("Velocity"))));
}

bool Actor::CheckCollision() const {
    return this->lsObject->GetMember("CheckCollision").Int;
}

bool Actor::CheckCollision(const float toX, const float toY, const float toZ) const {
    return this->lsObject->GetMember("CheckCollision", toX, toY, toZ).Int;
}

float Actor::TargetRingRadius() const {
    return this->lsObject->GetMember("TargetRingRadius").Float;
}

float Actor::CollisionRadius() const {
    return this->lsObject->GetMember("CollisionRadius").Float;
}

float Actor::CollisionScale() const {
    return this->lsObject->GetMember("CollisionScale").Float;
}

u_long Actor::WhoFollowingId() const {
    return this->lsObject->GetMember("WhoFollowingID").Int64;
}

string Actor::WhoFollowingName() const {
    return this->lsObject->GetMember("WhoFollowing").CharPtr;
}

float Actor::Speed() const {
    return this->lsObject->GetMember("Speed").Float;
}

float Actor::SwimmingSpeedModifier() const {
    return this->lsObject->GetMember("SwimmingSpeedMod").Float;
}

bool Actor::InMyGroup() const {
    return this->lsObject->GetMember("InMyGroup").Int;
}

bool Actor::Interactable() const {
    return this->lsObject->GetMember("Interactable").Int;
}

bool Actor::OnFlyingMount() const {
    return this->lsObject->GetMember("OnFlyingMount").Int;
}

bool Actor::FlyingUsingMount() const {
    return this->lsObject->GetMember("FlyingUsingMount").Int;
}

bool Actor::IsChest() const {
    return this->lsObject->GetMember("IsChest").Int;
}

bool Actor::IsBanker() const {
    return this->lsObject->GetMember("IsBanker").Int;
}

bool Actor::IsMerchant() const {
    return this->lsObject->GetMember("IsMerchant").Int;
}

bool Actor::IsAPet() const {
    return this->lsObject->GetMember("IsAPet").Int;
}

bool Actor::IsMyPet() const {
    return this->lsObject->GetMember("IsMyPet").Int;
}

bool Actor::IsAfk() const {
    return this->lsObject->GetMember("IsAFK").Int;
}

bool Actor::IsLfw() const {
    return this->lsObject->GetMember("IsLFW").Int;
}

bool Actor::IsLfg() const {
    return this->lsObject->GetMember("IsLFG").Int;
}

bool Actor::IsLinkdead() const {
    return this->lsObject->GetMember("IsLinkdead").Int;
}

bool Actor::IsCamping() const {
    return this->lsObject->GetMember("IsCamping").Int;
}

bool Actor::IsLocked() const {
    return this->lsObject->GetMember("IsLocked").Int;
}

bool Actor::IsAggro() const {
    return this->lsObject->GetMember("IsAggro").Int;
}

bool Actor::IsSolo() const {
    return this->lsObject->GetMember("IsSolo").Int;
}

bool Actor::IsHeroic() const {
    return this->lsObject->GetMember("IsHeroic").Int;
}

bool Actor::IsEpic() const {
    return this->lsObject->GetMember("IsEpic").Int;
}

bool Actor::IsNamed() const {
    return this->lsObject->GetMember("IsNamed").Int;
}

bool Actor::IsSwimming() const {
    return this->lsObject->GetMember("IsSwimming").Int;
}

bool Actor::IsEncounterBroken() const {
    return this->lsObject->GetMember("IsEncounterBroken").Int;
}

bool Actor::IsInvisible() const {
    return this->lsObject->GetMember("IsInvisible").Int;
}

bool Actor::IsClimbing() const {
    return this->lsObject->GetMember("IsClimbing").Int;
}

bool Actor::IsJumping() const {
    return this->lsObject->GetMember("IsJumping").Int;
}

bool Actor::IsFalling() const {
    return this->lsObject->GetMember("IsFalling").Int;
}

bool Actor::IsFD() const {
    return this->lsObject->GetMember("IsFD").Int;
}

bool Actor::IsDead() const {
    return this->lsObject->GetMember("IsDead").Int;
}

bool Actor::IsRooted() const {
    return this->lsObject->GetMember("IsRooted").Int;
}

bool Actor::CanTurn() const {
    return this->lsObject->GetMember("CanTurn").Int;
}

bool Actor::InCombatMode() const {
    return this->lsObject->GetMember("InCombatMode").Int;
}

bool Actor::IsCrouching() const {
    return this->lsObject->GetMember("IsCrouching").Int;
}

bool Actor::IsSitting() const {
    return this->lsObject->GetMember("IsSitting").Int;
}

bool Actor::OnCarpet() const {
    return this->lsObject->GetMember("OnCarpet").Int;
}

bool Actor::OnHorse() const {
    return this->lsObject->GetMember("OnHorse").Int;
}

bool Actor::ONGriphon() const {
    return this->lsObject->GetMember("OnGriphon").Int;
}

bool Actor::IsRunning() const {
    return this->lsObject->GetMember("IsRunning").Int;
}

bool Actor::IsWalking() const {
    return this->lsObject->GetMember("IsWalking").Int;
}

bool Actor::IsSprinting() const {
    return this->lsObject->GetMember("IsSprinting").Int;
}

bool Actor::IsBackingUp() const {
    return this->lsObject->GetMember("IsBackingUp").Int;
}

bool Actor::IsStrafingLeft() const {
    return this->lsObject->GetMember("IsStrafingLeft").Int;
}

bool Actor::IsStrafingRight() const {
    return this->lsObject->GetMember("IsStrafingRight").Int;
}

bool Actor::IsIdle() const {
    return this->lsObject->GetMember("IsIdle").Int;
}


int Actor::EncounterSize() const {
    return this->lsObject->GetMember("EncounterSize").Int;
}

int Actor::Difficulty() const {
    return this->lsObject->GetMember("Difficulty").Int;
}

int Actor::IsInSameEncounter(const u_long id) const {
    return this->lsObject->GetMember("IsInSameEncounter", id).Int;
}

int Actor::RaidSize() const {
    return this->lsObject->GetMember("RaidSize").Int;
}

string Actor::TagTargetNumber() const {
    return this->lsObject->GetMember("TagTargetNumber").CharPtr;
}

string Actor::TagTargetIcon() const {
    return this->lsObject->GetMember("TagTargetIcon").CharPtr;
}

int Actor::EffectCount() const {
    return this->lsObject->GetMember("EffectCount").Int;
}

void Actor::DoubleClick() const {
    this->lsObject->CallMethod("DoubleClick");
}

void Actor::WaypointTo() const {
    this->lsObject->CallMethod("WaypointTo");
}

void Actor::DoFace() const {
    this->lsObject->CallMethod("DoFace");
}

void Actor::DoTarget() const {
    this->lsObject->CallMethod("DoTarget");
}

void Actor::AddLocation(const string &notes) const {
    this->lsObject->CallMethod("Location", "Add", notes);
}

void Actor::DeleteLocation() const {
    this->lsObject->CallMethod("Location", "Delete");
}

void Actor::RequesteffectsInfo() const {
    this->lsObject->CallMethod("RequesteffectsInfo");
}
