#ifndef _PLAYERBOT_WOTLKDUNGEONOCCACTIONS_H
#define _PLAYERBOT_WOTLKDUNGEONOCCACTIONS_H

#include "Action.h"
#include "AttackAction.h"
#include "PlayerbotAI.h"
#include "UseItemAction.h"
#include "GenericSpellActions.h"

const Position uromSafePositions[3] =
{
    Position(1138.88f, 1052.22f, 508.36f),
    Position(1084.62f, 1079.71f, 508.36f),
    Position(1087.42f, 1020.132f, 508.36f)
};

class AvoidUnstableSphereAction : public MovementAction
{
public:
    AvoidUnstableSphereAction(PlayerbotAI* ai) : MovementAction(ai, "avoid unstable sphere") {}
    bool Execute(Event event) override;
};

class MountDrakeAction : public UseItemAction
{
public:
    MountDrakeAction(PlayerbotAI* ai) : UseItemAction(ai, "mount drake") {}
    bool Execute(Event event) override;
    bool isPossible() override;
};

class DismountDrakeAction : public Action
{
public:
    DismountDrakeAction(PlayerbotAI* ai) : Action(ai, "dismount drake") {}
    bool Execute(Event event) override;
};

class OccFlyDrakeAction : public MovementAction
{
public:
    OccFlyDrakeAction(PlayerbotAI* ai) : MovementAction(ai, "occ fly drake") {}
    bool Execute(Event event) override;
};

class OccDrakeAttackAction : public Action
{
public:
    OccDrakeAttackAction(PlayerbotAI* botAI) : Action(botAI, "occ drake attack") {}
    bool Execute(Event event) override;

protected:
    Unit* vehicleBase;
    bool CastDrakeSpellAction(Unit* target, uint32 spellId, uint32 cooldown);
    bool AmberDrakeAction(Unit* target);
    bool EmeraldDrakeAction(Unit* target);
    bool RubyDrakeAction(Unit* target);
};

class AvoidArcaneExplosionAction : public MovementAction
{
public:
    AvoidArcaneExplosionAction(PlayerbotAI* ai) : MovementAction(ai, "avoid arcane explosion") {}
    bool Execute(Event event) override;
};

class TimeBombSpreadAction : public MovementAction
{
public:
    TimeBombSpreadAction(PlayerbotAI* ai) : MovementAction(ai, "time bomb spread") {}
    bool Execute(Event event) override;
};

#endif
