#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#include <math.h>

uint64_t MiB_to_B(uint64_t input){
	return input*2048;
}

int main(int argc, char **argv){
	uint64_t sectors_512K;
	double sectors_1MiB;
	uint64_t start = 1;
	uint64_t end;
	uint64_t end_512K;
	uint64_t sectors = 0;
	uint64_t sectors_per_partition;
	uint8_t partition = 1;
	//uint8_t max_partitions = 4;
	//uint8_t count;
	//uint64_t remaining;
	//uint64_t end_reserve = 0;
	//uint64_t part_start[4] = 0;
	//uint64_t part_end[4] = 0;
	//uint64_t MiB = 1073741824;
	//uint64_t KiB_sectors_per_GiB = 262144;
	//uint64_t MiB_sectors_per_GiB = 1024;
	uint64_t num1 = 0;
	//uint64_t num2 = 0;
	uint64_t sectors_remainder = 0;

	double tmp1 = 0;
	//double tmp2 = 0;

	//double tmp3 = 0;


	if(argc != 2)
		exit(1);

	sectors_512K = (uint64_t)atol(argv[1]);


	printf("total sectors(512B): %" PRIu64 "\n", sectors_512K);

	sectors_1MiB = sectors_512K / 2048;

	printf("total sectors(1MiB): %lf\n", sectors_1MiB);
	//printf("total sectors(1MiB): %" PRIu64 "\n", sectors_1MiB);
	printf("device\t\t\tstart\t\t\tend\t\t\tsectors\n");

	//create 8 partitions: 64GiB each
	//start = 1;
//tmp1 = 

/*
int zp = n - (x % n);
        int pp = x/n;
        for(int i=0;i<n;i++)
        {
 
            if(i>= zp)
            cout<<(pp + 1)<<" ";
            else
            cout<<pp<<" ";
        }
*/
	tmp1 = (sectors_512K-2048) / 2048;
	//Total 1MiB sectors we can use
	sectors_1MiB = tmp1;
	
	sectors_per_partition = (uint64_t)(sectors_1MiB / 8) - 2;
//	sectors_remainder = sectors_1MiB % 8;
	sectors_remainder = (uint64_t)sectors_1MiB - sectors_per_partition*8;

printf("\n\n%lf\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\n\n\n", sectors_1MiB, sectors_per_partition, sectors_remainder);

	//sectors_remainder = sectors_1MiB-(sectors_per_partition*8);
	//sectors_remainder = floor(tmp1 % 8);
	//members - remainder
//	num1 = 8-sectors_remainder;
	//without remainder
//	sectors_per_partition = sectors_1MiB/8;
	//if(

	//cycle through members incementing untill max reached
//	for(num2=0; num2 < 8; num2++){
//		if(num2>=num1)
//			sectors_per_partition++;
//	}

/*
	tmp2 = sectors_512K;
	tmp1 = tmp2 / 2048;
	tmp1 -= 1;
	tmp1 /= 8;
	sectors_per_partition = floor(tmp1);;
*/

//	sectors_per_partition = MiB_sectors_per_GiB*64;


start = 1;
if(sectors_remainder > 0){
	num1 = 1;
	sectors_remainder--;
}else{
	num1 = 0;
}

end = start + sectors_per_partition + num1;
//sectors = end - start;
//
end_512K =  MiB_to_B(end + 1) - 1;
printf("%u\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\n", partition++, MiB_to_B(start), end_512K, end_512K-MiB_to_B(start));


start = end + 1;
if(sectors_remainder > 0){
        num1 = 1;
        sectors_remainder--;
}else{
        num1 = 0;
}
end = start + sectors_per_partition + num1;
//sectors = end - start;
end_512K =  MiB_to_B(end + 1) - 1;
printf("%u\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\n", partition++, MiB_to_B(start), end_512K, end_512K-MiB_to_B(start));

start = end + 1;
if(sectors_remainder > 0){
        num1 = 1;
        sectors_remainder--;
}else{
        num1 = 0;
}
end = start + sectors_per_partition + num1;
//sectors = end - start;
end_512K =  MiB_to_B(end + 1) - 1;
printf("%u\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\n", partition++, MiB_to_B(start), end_512K, end_512K-MiB_to_B(start));

start = end + 1;
if(sectors_remainder > 0){
        num1 = 1;
        sectors_remainder--;
}else{
        num1 = 0;
}
end = start + sectors_per_partition + num1;
//sectors = end - start;
end_512K =  MiB_to_B(end + 1) - 1;
printf("%u\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\n", partition++, MiB_to_B(start), end_512K, end_512K-MiB_to_B(start));

start = end + 1;
if(sectors_remainder > 0){
        num1 = 1;
        sectors_remainder--;
}else{
        num1 = 0;
}
end = start + sectors_per_partition + num1;
//sectors = end - start;
end_512K =  MiB_to_B(end + 1) - 1;
printf("%u\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\n", partition++, MiB_to_B(start), end_512K, end_512K-MiB_to_B(start));

start = end + 1;
if(sectors_remainder > 0){
        num1 = 1;
        sectors_remainder--;
}else{
        num1 = 0;
}
end = start + sectors_per_partition + num1;
//sectors = end - start;
end_512K =  MiB_to_B(end + 1) - 1;
printf("%u\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\n", partition++, MiB_to_B(start), end_512K, end_512K-MiB_to_B(start));

start = end + 1;
if(sectors_remainder > 0){
        num1 = 1;
        sectors_remainder--;
}else{
        num1 = 0;
}
end = start + sectors_per_partition + num1;
//sectors = end - start;
end_512K =  MiB_to_B(end + 1) - 1;
printf("%u\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\n", partition++, MiB_to_B(start), end_512K, end_512K-MiB_to_B(start));

start = end + 1;
start = MiB_to_B(start);
end = sectors_512K-1;
sectors = end - start;
printf("%u\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\t\t\t%" PRIu64 "\n", partition++, start, end, sectors);



	return 0;
}
