#pragma once
#include "point.hpp"
#include "matrix.hpp"
#include <functional>

using matrix::Matrix;

constexpr const int PATHING_TOWARD=1;
constexpr const int PATHING_AWAY=-1;
constexpr const int DIRECTION_MAX=8;

class Pathing {
public:
  size_t $width;
  size_t $height;
  Matrix $paths;
  Matrix $input;

  Pathing(size_t width, size_t height) :
    $width(width),
    $height(height),
    $paths(height, matrix::Row(width, 1)),
    $input(height, matrix::Row(width, 1))
  {}

  void compute_paths(Matrix &walls);
  void set_target(const Point &at, int value=0);
  void clear_target(const Point &at);
  Matrix &paths() { return $paths; }
  Matrix &input() { return $input; }
  int distance(Point to) { return $paths[to.y][to.x];}
  bool random_walk(Point &out, bool random, int direction,
      size_t slice_count=4, size_t dist_size=4);

  bool INVARIANT();
};