#ifndef SCRIPTS_H
#define SCRIPTS_H

#include "buysell.h"
#include "dispatchers.h"
#include "galaxy.h"
#include <stack>
#include "ansicolor.h"

class ScriptTerror : public Dispatch {
 private:
  MoveDispatch * md;
  std::shared_ptr<Dispatch> move;
  InputDispatch * id;
  std::shared_ptr<Dispatch> input;
  TraderDispatch * td;
  std::shared_ptr<Dispatch> trader;
  std::string old_trade_end_empty;
  
 public:
  ScriptTerror(Director &);
  ~ScriptTerror();
  int loops;
  int max_loops;
  port_pair_type ppt;
  
  void init(void);

  void activate(void) override;
  void deactivate(void) override;

  void input_notify(void);
  void move_notify(void);
  void trade_notify(void);

  void server_prompt(const std::string &prompt) override;
};

class ScriptVoyager : public Dispatch {
  private:
    MoveDispatch * md;
    std::shared_ptr<Dispatch> move;
    InputDispatch * id;
    std::shared_ptr<Dispatch> input;
    void next(void);
    
  public:
    ScriptVoyager(Director &);
    ~ScriptVoyager();
    int loops;

    void init(void);

    void activate(void) override;
    void deactivate(void) override;

    void input_notify(void);
    void move_notify(void);

    void server_prompt(const std::string &prompt) override;
};

class ScriptExplore : public Dispatch {
  private:
    MoveDispatch * md;
    std::shared_ptr<Dispatch> move;
    InputDispatch * id;
    std::shared_ptr<Dispatch> input;
    void next(void);
    std::shared_ptr<Dispatch> us;

  public:
    ScriptExplore(Director &);
    ~ScriptExplore();
    int loops;
    bool infinite;
    bool prefer_ports;
    int state;
    int target;
    std::stack<sector_type> unknown_warps;
    
    void init(void);

    void activate(void) override;
    void deactivate(void) override;
    
    void input_notify(void);
    void move_notify(void);

    void server_prompt(const std::string &prompt) override;
};

class ScriptPlanet : public Dispatch {
  private:
    MoveDispatch * md;
    std::shared_ptr<Dispatch> move;
    InputDispatch * id;
    std::shared_ptr<Dispatch> input;
    TraderDispatch * td;
    std::shared_ptr<Dispatch> trader;
    void next(void);
    std::shared_ptr<Dispatch> us;
    
  public:
    ScriptPlanet(Director &);
    ~ScriptPlanet();
    int planet;
    int sector;
    int state;
    int current_level;

    int population[3];
    int total_population;
    int amount[3];
    int ship[3];
    int to_make_one[3];

    int support_construction;
    int needs[3];
    int days;

    void init(void);

    void activate(void) override;
    void deactivate(void) override;

    void input_notify(void);
    void move_notify(void);
    void trade_notify(void);

    void server_prompt(const std::string &prompt) override;
    void server_line(const std::string &line, const std::string &raw_line) override;
    void client_input(const std::string &input) override;
  private:
    void clear_amounts(void); 
    int place_colonists(void);   
};

#endif