// include guard
#ifndef PRIORITYQ_H
#define PRIORITYQ_H

#include "json.hpp"
class PriorityQueue{
  int *heapArray;                // pointer to heap array
  int max_size;                  // max size of heap array
  int heap_size;                 // elements in heap
  void swap(int*, int*);         // swaps two keys in the heap
  void heapifyUp(int);           // moves keys up if they are larger than their parent key
  void heapifyDown(int);         // moves keys down if they are smaller than their parent key
public:
  // required functions from PDF
  void insert(int);              // inserts a new key into heap
  void removeMax();              // removes the maximum value key (the root)
  void removeKey(int);           // removes the key with the specific value
  void change(int, int);         // changes the value of one key for a new, given value
  // helpful functions
  void printJSONTree(int, int);  // prints the heap as a JSON object
  void initiateHeap(int);        // initiates a heap with the given capacity in the heap
  void deleteHeap();             // deletes the array at the end to avoid memory leaks
  int returnMax();               // returns the value of the root
};

// initiate functions
void insert(int key);
void removeMax();
void removeKey(int key);
void change(int key, int newKey);
void heapifyUp(int index);
void heapifyDown(int index);
void printJSONTree(int, int);
void initiateHeap(int capacity);
int returnMax();
void deleteHeap();
void swap(int*, int*);


#endif
