#include <iostream>
#include <cstdlib>
#include <ctime>
#include <unistd.h>
#include <iomanip>
#include <sys/mman.h>
#include <chrono>

#include "ProlificScheduler.hpp"
#include "SortTask.hpp"

void print_matrix(int* A,int n) {
	for(int i=0; i<n; i++) {
		for(int j=0; j<n; j++) {
			std::cout << std::setw(5) << A[i*n+j] << " ";
		}
		std::cout << "\n";
	}
}

int main() {
	srand(time(0));

	int n;

	std::cout << "Dwse megethos n tou pinaka A(nxn) : ";
	std::cin >> n;

	if(n<=0){
		std::cerr << "Sfalma , adynato megethos pinaka ";
		return 1;
	}

	int num_workers=n;

	int* A=(int*) mmap(NULL, n*n*sizeof(int) , PROT_READ| PROT_WRITE , MAP_SHARED | MAP_ANONYMOUS , -1 , 0);

	if (A==MAP_FAILED) {
		std::cerr<< "Sfalma mmap\n";
		return 1;
	}

	for(int i=0; i<n*n; i++) {
		A[i]=(rand()%2001)-1000;
	}

	if (n<=15) {	
		std::cout<< "O pinakas arxika \n";
		print_matrix(A,n);
	}

	SortTask mySortTask(A,n);
	ProlificScheduler scheduler(num_workers);

	auto start_time = std::chrono::high_resolution_clock::now();
	scheduler.execute_task(&mySortTask);
	auto end_time = std::chrono::high_resolution_clock::now();


	std::chrono::duration<double , std::milli> elapsed=end_time - start_time;

	if(n<=15) {
		std::cout<<"Pinakas telika : \n ";
		print_matrix(A,n);
	}

	std::cout <<"Me ton prolific scheduler h taksinomisi egine se xrono : " <<elapsed.count() << " ms\n";

	munmap(A,n*n*sizeof(int));

	return 0;

}
