#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>
#include "cores.h"
#include "processes.h"
#include "cpuinfo.h"
#include "frequency.h"
//#define SIZE 1000

//void pause( void );

//struct timeval starttime,endtime;
//double te0,te1,te2,te3,te4,te5,te6,te7;

int count, count2, count3;
char *cpu = "cpu";

//cpufrequency = frequency(cpu);
//int cpufrequency = 60;

//cpufrequency = atoi(cpufrequency);
//printf( "CPU POLLING FREQ: %d\n", cpufrequency );
//int cores = coresdetected();
//int cores = 4;
//printf( "NUMBER OF CORES: %d\n", cores );
double cpuarray1[3][64][10];
double minutearray[61][64][9];
double minutearray2[64][9];
double walltime[61];



main() {

	//int minutearray2 = tenminute(cores, cpufrequency);
	//double cpuarray1[2][cores][8]; 
	//char *cpu = "cpu";
	int cpufrequency = frequency(cpu);
	cpufrequency = atoi(cpufrequency);
	int cores = coresdetected();
int count4;
for (count4 = 1; count4 < 3; count4++)
{
	//minutearray[0][0][0] = '\0';
	//minutearray2[0][0] = '\0';
	//cpuarray1[0][0][0] = '\0';
	tenminute(cores, cpufrequency, cpuarray1, minutearray, minutearray2, walltime);
	//cpuinfo(cores, cpufrequency, cpuarray1);

                for (count2 = 1; count2 <= cores; count2++)
                {
                        
                        for (count3 = 1; count3 < 8; count3++)
                        {
				//printf("%d %d: %lf\n", count2, count3, cpuarray1[2][count2][count3]);
				printf("core%d value%d: %lf\n", count2, count3, minutearray2[count2][count3]);
                                //minutearray2[count2][count3]
                        
                        }
                        
                }
}


	//double cpuarray1[2][cores][7] = cpuinfo(cores, cpufrequency);

	//printf(": %lf\n", cpuarray1[2][cores][7]); 
	int processes2 = processes();
	printf( "NUMBER OF PROCS: %d\n", processes2 );
	return 0;
}


int tenminute(int cores, int cpufrequency, double cpuarray1[2][4][8], double minutearray[61][64][9], double minutearray2[64][9],double walltime[61]) {
	oneminute(cores, cpufrequency, cpuarray1, minutearray, minutearray2, walltime);
	//int minutearray2 = oneminute(cores, cpufrequency);
	//minutearray2 = oneminute(cores, cpufrequency)
	return 0;
}

//double minutearray[61][64][9];
//double minutearray2[64][9];



int oneminute(int cores, int cpufrequency, double cpuarray1[2][4][8], double minutearray[61][64][9], double minutearray2[64][9], double walltime[61]) {
	//printf("cores: %d cpufrequency: %d inside onminute\n", cores, cpufrequency);
        int user, nice, system, idle, iowait, irq, softirq, totalcycles;
	int count1, count2, count3;
	int poll = 60 / cpufrequency;
	//int minutearray[poll][cores][8];
	//int minutearray2[cores][8];
	//double walltime[poll]; 
	double walltimetotal = 0;
	//minutearray[0][0][0] = 0;
	for (count1 = 1; count1 <= poll; count1++)
	{
		double te0 = cpuinfo(cores, cpufrequency, cpuarray1);
		//double cpuarray1[2][cores][8] = cpuinfo(cores, cpufrequency);
		for (count2 = 1; count2 <= cores; count2++)
		{
			
                        //for (count3 = 1; count3 < 8; count3++)
                        //{
                                //total cpu cycles used per core/run
                          //      minutearray[count1][count2][8] = minutearray[count1][count2][8] + cpuarray1[2][count2][count3];
				//runtime between reads
				

                        //}

				//poll cpu variable	 //run two minus run one, cycles for those variables
                	minutearray[count1][count2][1] = (cpuarray1[2][count2][1] - cpuarray1[1][count2][1]);
        		minutearray[count1][count2][2] = (cpuarray1[2][count2][2] - cpuarray1[1][count2][2]);
        		minutearray[count1][count2][3] = (cpuarray1[2][count2][3] - cpuarray1[1][count2][3]);  
        		minutearray[count1][count2][4] = (cpuarray1[2][count2][4] - cpuarray1[1][count2][4]);
        		minutearray[count1][count2][5] = (cpuarray1[2][count2][5] - cpuarray1[1][count2][5]);
        		minutearray[count1][count2][6] = (cpuarray1[2][count2][6] - cpuarray1[1][count2][6]);
        		minutearray[count1][count2][7] = (cpuarray1[2][count2][7] - cpuarray1[1][count2][7]);
			minutearray[count1][count2][8] = 0;
			for (count3 = 1; count3 < 8; count3++)
			{
				//total cpu cycles used per core/run
				minutearray[count1][count2][8] = (minutearray[count1][count2][8] + minutearray[count1][count2][count3]); 
			}
			//translate cycles into percentage use
                        minutearray[count1][count2][1] = ((minutearray[count1][count2][1] / minutearray[count1][count2][8]) * 100);
                        minutearray[count1][count2][2] = ((minutearray[count1][count2][2] / minutearray[count1][count2][8]) * 100);
                        minutearray[count1][count2][3] = ((minutearray[count1][count2][3] / minutearray[count1][count2][8]) * 100);
                        minutearray[count1][count2][4] = ((minutearray[count1][count2][4] / minutearray[count1][count2][8]) * 100);
                        minutearray[count1][count2][5] = ((minutearray[count1][count2][5] / minutearray[count1][count2][8]) * 100);
                        minutearray[count1][count2][6] = ((minutearray[count1][count2][6] / minutearray[count1][count2][8]) * 100);
                        minutearray[count1][count2][7] = ((minutearray[count1][count2][7] / minutearray[count1][count2][8]) * 100);
                        //walltime[poll] = 

			
		}
		//the runtime between reads for that polling
		walltime[poll] = te0;
		//that total 
		walltimetotal = walltimetotal + te0;
	}
/*
//int a[2][2][2];
int *p;
int i;

a[0][0][0] = 0;
a[0][0][1] = 1;
a[0][1][0] = 2;
a[0][1][1] = 3;
a[1][0][0] = 4;
a[1][0][1] = 5;
a[1][1][0] = 6;
a[1][1][1] = 7;


p = minutearray;

for(i = 0; i < 20; i++)
printf("%d, ",p[i]);
printf("%d\n",p[i]);



	printf("TEST: %lf\n", minutearray[1][1][2]);	
	printf("TEST: %lf\n", walltime[1]);
	printf("TEST: %lf\n", walltimetotal);
	//minutearray[2][4][7] = 224; 
	printf("TEST: %lf\n", minutearray[2][4][7]);
*/
	// determine average percentage use for given minute, weighted average taking into account walltime of each polling
	//memset(minutearray2, 0, 9);
	memset( (void *) minutearray2, '\0', sizeof(double) * 64 * 9);
        for (count1 = 1; count1 <= poll; count1++)
        {

		for (count2 = 1; count2 <= cores; count2++)
                {

			for (count3 = 1; count3 < 8; count3++)
                        {
				//minutearray2[count2][count3] = minutearray2[count2][count3] + (minutearray[count1][count2][count3] * (walltime[poll]/ walltimetotal));
				minutearray2[count2][count3] = (minutearray2[count2][count3] + (minutearray[count1][count2][count3] * (walltime[poll]/ walltimetotal)));
			}

		}

	}
	//printf("TEST: %lf\n", minutearray2[1][2]);
	//total runtime in seconds for entire minute
	//minutearray[0][0][0] = minutearray[0][0][0] + cpuarray1[0][0][0];
	//account for processing time loss
	//minutearray[0][0][0] = (minutearray[0][0][0] / poll) * 60

          /*      for (count2 = 1; count2 <= cores; count2++)
                {

                        for (count3 = 1; count3 < 8; count3++)
                        {
                                printf("%d %d: %lf\n", count2, count3, cpuarray1[2][count2][count3]);
                                //printf("core%d value%d: %d\n", count2, count3, minutearray2[count2][count3]);
                                //minutearray2[count2][count3]

                        }       
        
                }
	
		*/

        //totalcycles = user + nice + system + idle + iowait + irq + softirq;
        //te1 = (te0 / cpufrequency) * 60;
        //user = (user / totalcycles) * 100;
        //nice = (nice / totalcycles) * 100;
        //system = (system / totalcycles) * 100;
        //idle =  (idle / totalcycles) * 100;
        //iowait = (iowait / totalcycles) * 100;
        //irq = (irq / totalcycles) * 100;
        //softirq = (softirq / totalcycles) * 100;
        
        //printf(": %lf\n", cpuarray1[2][cores][7]);
	return 0;
}

