#ifndef PQUEUE_H
#define PQUEUE_H
 
class PQueue
{
private:
    int *heap;
    int size;
    int bottom;
	void ReHeapUp();
    void ReHeapDown();
public:
    PQueue(int s);
    ~PQueue();
    void enqueue(int i);
    void dequeue();
    int top();
   
};
 
PQueue::PQueue(int s)
{
    heap = new int[s];
    size = s - 1;
 
    for (int i = 0; i < s; i++)
		heap[i] = 0;
    bottom = -1;
}
 
PQueue::~PQueue()
{
    delete[] heap;
}
 
void PQueue::enqueue(int i)
{
    if (bottom == size)
		return;
 
	// Insert the number at the bottom of the heap
    heap[++bottom] = i;
	
	// Call ReHeapUp to have it bubble to the top
    ReHeapUp();
}
 
void PQueue::dequeue()
{
    if (bottom == -1)
		return;
 
	// Swap the top and bottom number
    int temp = heap[0];
    heap[0] = heap[bottom];
    heap[bottom] = temp;
	
	// Move the bottom towards the top of the heap to "drop" the previous top number
    bottom--;
	
	
	// Call ReHeapDown to have the heap restored to a correct state
    ReHeapDown();
}
 
int PQueue::top()
{
    if (bottom == -1) // Returns -1 if the queue is empty
		return -1;
 
    return heap[0]; // Other wise return the top element
}
 
void PQueue::ReHeapDown()
{
    int index = 0;
    int larger_child;
 
	// This is a lambda function to get the left child of the current index
    auto left = [](int idx) {
		return ((2*idx)+1);
    };
 
	// This is a lambda function to get the right child of the current index
    auto right = [](int idx) {
		return ((2 * idx) + 2);
    };
	
	// The loop checks two things, first, it checks if we have both a left and a right child by making sure the left child index is below the bottom of the heap
	// Then it also checks if either of the children is larger than it's parent, because that would warrant a swap.
    while (left(index) < bottom && (heap[index] < heap[left(index)] || heap[index] < heap[right(index)]))
    {
		if (heap[left(index)] > heap[right(index)]) // If the left child is larger than the right, we swap out the left child
			larger_child = left(index);
		else // otherwise we swap out the right child
			larger_child = right(index);
	 
		// Swap the largest child for the current value to move it down the heap
		int temp = heap[index];
		heap[index] = heap[larger_child];
		heap[larger_child] = temp;
		
		// The child index is now the new index
		index = larger_child;
	}
	
	// if we only have a left child then it's not checked by the above loop, but index is not necesarily the largest yet. If the only child is larger, swap it.
	if(left(index) == bottom && heap[index] < heap[left(index)])
	{
		int temp = heap[index];
		heap[index] = heap[bottom];
		heap[bottom] = temp;
	}
}

void PQueue::ReHeapUp()
{
	// This is a lambda to get the parent index
    auto parent = [](int idx) {
		return ((idx - 1) / 2);
    };
 
    int index = bottom; // STARTED AT THE BOTTOM NOW WE HERE
    while (heap[index] > heap[parent(index)] && parent(index) >= 0) // So long as the parent is not "above" the root, and the child is larger than its parent
	{
		// Swap the parent & child
		int temp = heap[index];
		heap[index] = heap[parent(index)];
		heap[parent(index)] = temp;
		
		// Move the index up
		index = parent(index);
    }
}
 
#endif /* PQUEUE_H */