#pragma once
#include "GameCore.h"
#include "Node.h"
#include <vector>

using namespace std;

class PathAlgorithm{
public:
    enum NEIGHBOR{UP, UP_RIGHT, RIGHT, DOWN_RIGHT, DOWN, DOWN_LEFT, LEFT, UP_LEFT};

    PathAlgorithm(void);
    PathAlgorithm(POINT* origin, POINT* destination);
    PathAlgorithm(Node* root, POINT* destination, vector<Node*>* open, vector<Node*>* closed, vector<POINT*>* solution);

    virtual ~PathAlgorithm(void);

    virtual void init(Node* root, POINT* destination, vector<Node*>* open, vector<Node*>* closed, vector<POINT*>* solution);

    virtual void run() = 0;
    // getter setter node
    virtual Node* getRoot();
    virtual void  setRoot(Node* root);
    // getter setter destination
    virtual POINT* getDestination();
    virtual void   setDestination(POINT* destination);
    // getter setter open
    virtual vector<Node*>* getOpen();
    virtual void setOpen(vector<Node*>* open);
    // getter setter closed
    virtual vector<Node*>* getClosed();
    virtual void setClosed(vector<Node*>* closed);
    // getter setter solution
    virtual vector<POINT*>* getSolution();
    virtual void setSolution(vector<POINT*>* solution);
    // clean up old data
    // deletes values in open and closed
    // does not delete data in solution just removes it
    virtual void PathAlgorithm::clean();

    virtual TILE* getNeighbor(Node* node, PathAlgorithm::NEIGHBOR neighbor) = 0;

protected:
    Node*  root;
    POINT* destination;

    vector<Node*>* open;
    vector<Node*>* closed;
    vector<POINT*>* solution;
};

