// Non Preemptive Priority Scheduling Algorithm


#include <iostream>
void First_Come_First_Serve(std::string name_of_process[], int burst_time[],int priority[],int number_of_processes){
    
    double waiting_time = 0;
    double turnaround_time = 0;
    double total_waiting_time = 0;
    double total_turnaround_time = 0;    

    std::cout<<"Name Of Process\tBurst Time\tPriority\tWaiting Time\tTurnAround Time"<<std::endl;

    for (int i=0;i<number_of_processes;i++){
        turnaround_time += burst_time[i];
        total_turnaround_time+=turnaround_time;
        
       std::cout<<name_of_process[i]<<"\t\t"<<burst_time[i]<<"\t\t"<<priority[i]<<"\t\t"<<waiting_time<<"\t\t"<<turnaround_time<<std::endl;
       
       total_waiting_time+=waiting_time;
       waiting_time += burst_time[i];
    }
    std::cout<<"\nAverage Waiting Time is:: "<<total_waiting_time/number_of_processes<<"\nAverage TurnAround Time is::"<<total_turnaround_time/number_of_processes<<std::endl;
}
void Sort(std::string name_of_process[], int burst_time[],int priority[],int number_of_processes){
    for(int i=0;i<number_of_processes;i++){
        for(int j=0;j<number_of_processes;j++){
            if (priority[i] < priority[j]){
                int temp_burst = burst_time[i];
                burst_time[i] = burst_time[j];
                burst_time[j] = temp_burst;
                int temp_priority = priority[i];
                priority[i] = priority[j];
                priority[j] = temp_priority;
                std::string temp_name_of_process = name_of_process[i];
                name_of_process[i] = name_of_process[j];
                name_of_process[j]= temp_name_of_process;
            }
        }
    }
    First_Come_First_Serve(name_of_process,burst_time,priority,number_of_processes);
}

int main(){
    int number_of_processes;

    std::cout<<"Enter the number of processes: ";
    std::cin>>number_of_processes;
    std::string name_of_process[number_of_processes];
    int burst_time[number_of_processes];
    int priority[number_of_processes];

    for (int i=0;i<number_of_processes;i++){
        std::cout<<"Enter Name of Process:: ";
        std::cin>>name_of_process[i];
        std::cout<<"Enter Burst Time of Process "<<name_of_process[i]<<":: ";
        std::cin>>burst_time[i];
        std::cout<<"Enter Priority of Process "<<name_of_process[i]<<":: ";
        std::cin>>priority[i];
    }
    
    Sort(name_of_process,burst_time, priority,number_of_processes);

}