#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <unistd.h>
#include <iomanip>

#include "ProlificScheduler.hpp"
#include "CollectiveScheduler.hpp"
#include "SortTask_pipes.hpp"

using namespace std;
void print_matrix(const vector<int>& A, int n) {
	for(int i=0; i<n; i++){
		for(int j=0; j<n; j++) {
			cout << setw(5) << A[i*n + j] << " ";
		}
	cout << "\n";
	}
cout << "----------------------------------------\n";
}

int main() {
	srand(time(0));
	int n=5;

	vector<int> A(n*n);
	for (int i=0; i <n*n; i++) {
		A[i]=(rand()%2001)-1000;
	}
	cout<< "Arxikos pinakas A ("  << n << "x" << n <<") ====\n";
	print_matrix(A,n);

	int pipefd[2];
	if (pipe(pipefd)==-1) {
		cerr << "Sfalma ";
		return 1;
	}

	SortTask mySortTask(A.data() , n, pipefd[1]);

	cout <<"Prolific scheduler: \n";
	cout << "----------------------------------------\n";
	ProlificScheduler scheduler(n);
	scheduler.execute(&mySortTask);

	int* read_array=new int[n+1];
	for (int k=0; k<n; k++) {
		read(pipefd[0] , read_array,(n+1)*sizeof(int));
		int row_index=read_array[0];

		for(int j=0; j<n; j++){
			A[row_index*n + j] =read_array[j+1];
		}
	}
	delete[] read_array;

	cout << "Taksinomimenos ana grammi \n";
	print_matrix(A,n);

	close(pipefd[0]);
	close(pipefd[1]);

	return 0;
}
