#pragma once
#include "TacticalAction.h"
#include "../../../../PerceptualState/World/TechTypeObject.h"
#include "../../../../PerceptualState/World/UpgradeTypeObject.h"

class Research : public virtual TacticalAction
{
public:
  Research(const Process* parent, unsigned int priority)
    : TacticalAction(parent, priority)
    , Process(parent)
  {
  }
};

class UpgradeResearch : public virtual Research
{
public:
  UpgradeResearch(const Process* parent, unsigned int priority, UpgradeTypeObject* upgrade);

protected:
  virtual void _output(std::ostream& out) const
  {
    Research::_output(out);

    out << "Upgrade-Research(" << *m_upgrade << ")";
  }

  UpgradeTypeObject* const m_upgrade;
};

class TechResearch : public virtual Research
{
public:
  TechResearch(const Process* parent, unsigned int priority, TechTypeObject* tech);

protected:
  virtual void _output(std::ostream& out) const
  {
    Research::_output(out);

    out << "Tech-Research(" << *m_tech << ")";
  }

  TechTypeObject* const m_tech;
};