#pragma once
#include "../DecisionMaking/Layer2Actions/Layer2Actions.h"

class TacticalAction;

class InactiveLayer2 : public Layer2Actions
{
public:
  InactiveLayer2(Layer2Cueing& layer2Cueing, Layer1Reactive& layer1Reactive)
    : Layer2Actions(layer2Cueing, layer1Reactive)
  {
  }

  virtual AttackMove* instantiateAttackMove(const Process*, unsigned int, const PersistentUnitGroup*, AutoPopulatedLocation*) { throw std::runtime_error("Inactive"); }
  virtual Build* instantiateBuild(const Process* , unsigned int , AutoPopulatedLocation* , BWAPI::UnitType ) { throw std::runtime_error("Inactive"); }
  virtual CollectMinerals* instantiateCollectMinerals(const Process* , unsigned int , const PersistentUnitGroup* , BaseLocation* ) { throw std::runtime_error("Inactive"); }
  virtual CollectGas* instantiateCollectGas(const Process* , unsigned int , const PersistentUnitGroup* , BaseLocation* ) { throw std::runtime_error("Inactive"); }
  virtual Defend* instantiateDefend(const Process* , unsigned int , const PersistentUnitGroup* , Location* ) { throw std::runtime_error("Inactive"); }
  virtual Expand* instantiateExpand(const Process* , unsigned int , BaseLocation* ) { throw std::runtime_error("Inactive"); }
  virtual Harass* instantiateHarass(const Process* , unsigned int , const PersistentUnitGroup* , Location* ) { throw std::runtime_error("Inactive"); }
  //virtual Move* instantiateMove(const Process* parent, unsigned int priority, const PersistentUnitGroup* initialGroup, Location* destination) { throw std::runtime_error("Inactive"); }
  virtual Recruit* instantiateRecruit(const Process* , unsigned int , AutoPopulatedLocation* , const std::map<BWAPI::UnitType, size_t>& , bool ) { throw std::runtime_error("Inactive"); }
  virtual Recruit* instantiateRecruit(const Process* , unsigned int , AutoPopulatedLocation* , BWAPI::UnitType , bool ) { throw std::runtime_error("Inactive"); }
  virtual UpgradeResearch* instantiateUpgradeResearch(const Process* , unsigned int , UpgradeTypeObject* ) { throw std::runtime_error("Inactive"); }
  virtual TechResearch* instantiateTechResearch(const Process* , unsigned int , TechTypeObject* ) { throw std::runtime_error("Inactive"); }
  virtual Scout* instantiateScout(const Process* , unsigned int , StaticLocation* ) { throw std::runtime_error("Inactive"); }
  virtual Scout* instantiateScout(const Process* , unsigned int , const PersistentUnitGroup* , StaticLocation* ) { throw std::runtime_error("Inactive"); }

  virtual Resources getAvailableResources(unsigned int ) const { throw std::runtime_error("Inactive"); }
  virtual Resources getLowestPriorityAvailableResources() const { throw std::runtime_error("Inactive"); }
  virtual Resources getHighestPriorityAvailableResources() const { throw std::runtime_error("Inactive"); }
  virtual size_t getNbAvailableBuildings(const BWAPI::UnitType , const AutoPopulatedLocation* ) const { throw std::runtime_error("Inactive"); }
  virtual bool needsAdditionalPylons() const { throw std::runtime_error("Inactive"); }

  /////////
  // GUI //
  /////////
  typedef TacticalAction** ActionIterator;
  std::pair<ActionIterator, ActionIterator> getCurrentActions() const
  {
    return std::make_pair(ActionIterator(NULL), ActionIterator(NULL));
  }
};