#ifndef PIXELDEFENSE_PATHFINDING_H
#define PIXELDEFENSE_PATHFINDING_H

#include <breeze.h>

#include "components.h"

typedef struct PathNode {
    i32 weight; // fCost = g + h
    i32 gCost; // from start cost
    i32 hCost; // to target cost
    TilePosition pos;
} PathNode;

typedef struct PathNodeRecord {
    bool visited : 1;
    bool open : 1;
    i8 toParentX : 3;
    i8 toParentY : 3;
    i32 nodeIdx;
} PathNodeRecord;

typedef struct PathfindingDesc {
    Position start;
    Position target;
    BzObjectPool *pool;
    BzTileMap *map;
    PathNode *openSet; // heap (size: width * height)
    PathNodeRecord *closedSet; // size: width * height
    Path *outPath;
} PathfindingDesc;

bool pathfindAStar(const PathfindingDesc *desc);

// TODO: Flowfield
void calculateFlowField();

#endif //PIXELDEFENSE_PATHFINDING_H
