#ifndef CHARACTER_H
#define CHARACTER_H

#include <string>

#include "Ability.h"
#include "LSObject.h"
#include "Actor.h"
#include "GroupMember.h"

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

    std::string Archetype() const;

    std::string SubClass() const;

    std::string TradeskillArchtype() const;

    std::string TradeskillClass() const;

    std::string TradeskillSubClass() const;

    Actor CursorActor() const;

    // GameData

    // Location
    bool IsMoving() const;

    bool InGameWorld() const;

    bool AtCharSelect() const;

    float WaterDepth() const;

    float HeadingTo(float toX, float toY, float toZ) const;

    string HeadingToAsString(float toX, float toY, float toZ) const;

    // Experience/Level
    int VeteranBonus() const;

    int Level() const;

    int EffectiveLevel() const;

    int TradeskillLevel() const;

    int APExperience() const;

    int TotalEarnedAPs() const;

    int MaxAPs() const;


    // Money
    u_long Copper() const;

    u_long Silver() const;

    u_long Gold() const;

    u_long Platinum() const;

    // Group information
    bool IsGroupLeader() const;

    bool Grouped() const;

    int GroupCount() const;

    GroupMember GroupMemberByIndex(const int index) const;

    GroupMember GroupMemberByName(const string &name) const;

    GroupMember GroupMemberById(const u_long id) const;

    // Raid Information
    int RaidCount() const;

    int RaidGroupNumber() const;

    int Raid() const;

    GroupMember RaidMemberByIndex(const int index) const;

    GroupMember RaidMemberByName(const string &name) const;

    GroupMember RaidMemberById(const u_long id) const;

    GroupMember RaidMemberByGroupAndIndex(const int group, const int index) const;

    // Abilities & Recipes
    int NumAbilities() const;

    Ability Ability(int index) const;
};


#endif //CHARACTER_H
