// PID: 730677144
// I pledge the COMP 211 honor code.

#include "schedule.h"
#include <stdio.h>
#include <stdlib.h>

void run_to_completion(task_struct* task) {
    printf("Task %d ran for %d cycles.\n", task->pid, task->remaining_cycles);
    task->remaining_cycles = 0;
    printf("Task %d completed.\n", task->pid);
}

void run_with_quantum(task_struct* task, unsigned int quantum) {
    if (task->remaining_cycles <= quantum) {
        run_to_completion(task);
    } else {
        printf("Task %d ran for %d cycles.\n", task->pid, quantum);
        task->remaining_cycles -= quantum;
    }
}


void fcfs() {
    while (get_task(0) != NULL) {
        run_to_completion(remove_task(get_task(0)->pid));
    }
}


/**
 * While the queue is not empty:
 *  - Min heapify the linked list.
 *  - Get the highest priority task from the list (the one at the head).
 *  - Remove and run the highest priority task for the given quantum.
 *  - If the task is not complete, then append it to the linked list.
*/

void priority_queue(unsigned int quantum) {
    while(get_task(0) != NULL) {
        if (size() > 1)
            min_heapify();
        
        task_struct *task = remove_task(get_task(0)->pid);
        
        run_with_quantum(task, quantum);
        if (task->remaining_cycles != 0)
        {
            append_task(task->pid, task->priority, task->remaining_cycles);
        }
    }
}

void round_robin(unsigned int quantum) {
    while (get_task(0) != NULL) {
        task_struct* task = get_task(1 % size());
        run_with_quantum(task, quantum);
        if (task->remaining_cycles == 0) {
            remove_task(task->pid);
        }
    }
}