#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "procutils.h"
#include "logutils.h"

static int g_lastProcUsageData[4];

#define LOGCHANNEL "ORCDPROC"

float getSystemLoadAverage()
{
  char buf[1024];
  FILE *f=fopen("/proc/loadavg","r");

  if (f==NULL)
    {
      logerrno(LOG_ERROR,LOGCHANNEL,"Couldn't read /proc/loadavg");
      return -1;
    }

  fgets(buf,1000, f);

  fclose(f);

  return atof(buf);
}

void getProcessorUsage(float *user, float *system)
{
  char buf[1024];
  FILE *f=fopen("/proc/stat","r");

  *user=0;
  *system=0;

  if (f==NULL)
    {
      logerrno(LOG_ERROR,LOGCHANNEL,"Couldn't read /proc/stat");
      return;
    }

  while (fgets(buf,1000,f)!=NULL)
    {
      /* we look for a line with 4 numbers beginning with "cpu".
       * each of the numbers is in "jiffies", nominally 1/100s.
       * 0: time spent in user
       * 1: time spent in low priority user
       * 2: time spent in system
       * 3: time spent in idle task
       **/
      if (!strncmp(buf,"cpu ",4))
	{
	  int len=strlen(buf);
	  int pos=0;
	  int count=0;
	  int d[4],diff[4];

	  d[0]=0;
	  d[1]=0;
	  d[2]=0;
	  d[3]=0;

	  //	  printf("%s: ",buf);

	  while (pos<len && count<4)
	    {
	      while (!isdigit(buf[pos]) && pos<len && count<4)
		pos++;
	      
	      d[count]=atoi(&buf[pos]);
	      count++;

	      while (isdigit(buf[pos]) && pos<len)
		pos++;
	    }
	  
	  if (count<4)
	    goto exit;

	  int total=0;
	  for (pos=0;pos<4;pos++)
	    {
	      diff[pos]=d[pos]-g_lastProcUsageData[pos];
	      total+=diff[pos];
	      g_lastProcUsageData[pos]=d[pos];
	    }

	  //	  printf("d[]: %i\t%i\t%i\t%i\t%i\n",diff[0],diff[1],diff[2],diff[3],total);

	  //	  usage=100.0-100.0*diff[3]/total;
	  if (total==0)
	    {
	      *user=0;
	      *system=0;
	    }
	  else
	    {
	      *user=100.0*(diff[0]+diff[1])/total;
	      *system=100.0*(diff[2])/total;
	    }

	  //	  printf("us: %f\t%f\n",*user,*system);
	  goto exit;
	}
    }
 exit:
  fclose(f);
  //  return usage;
}
