#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <argp.h>
#include <sys/stat.h>
#include <sys/mman.h>

#include "interfaces/sensor2.h"
#include "sensor_threshold.h"


gboolean
get_threshold_state (SensorIntegerThreshold    *sen,
                   GDBusMethodInvocation  *invocation,
                   gpointer               user_data)
{
  guint state = sensor_integer_threshold_get_state(sen);
  sensor_integer_threshold_complete_get_state(sen,invocation,state);
  return TRUE;
}


gboolean
set_thresholds (SensorIntegerThreshold        *sen,
                   GDBusMethodInvocation  *invocation,
		   guint                  lc,
		   guint                  lw,
		   guint                  uw,
		   guint                  uc,
                   gpointer               user_data)
{
  sensor_integer_threshold_set_lower_critical(sen,lc);
  sensor_integer_threshold_set_lower_warning(sen,lw);
  sensor_integer_threshold_set_upper_warning(sen,uw);
  sensor_integer_threshold_set_upper_critical(sen,uc);
  sensor_integer_threshold_complete_set(sen,invocation);
  sensor_integer_threshold_set_state(sen,NORMAL);
  return TRUE;
}


void check_thresholds(SensorIntegerThreshold* sensor,guint value)
{
  	threshold_states current_state = sensor_integer_threshold_get_state(sensor);
 	if (current_state != NOT_SET) 
	{
		threshold_states state = NORMAL;

		if (value < sensor_integer_threshold_get_lower_critical(sensor)) {
    			state = LOWER_CRITICAL;
  		}
		else if(value < sensor_integer_threshold_get_lower_warning(sensor)) {
    			state = LOWER_WARNING;
		}
		else if(value > sensor_integer_threshold_get_upper_critical(sensor)) {
 			state = UPPER_CRITICAL;
		}
		else if(value > sensor_integer_threshold_get_upper_warning(sensor)) {
 			state = UPPER_WARNING;
		}
		// only emit signal if threshold state changes
		if (state != sensor_integer_threshold_get_state(sensor))
		{
			sensor_integer_threshold_set_state(sensor,state);
			if (state == LOWER_CRITICAL || state == UPPER_CRITICAL)
			{
				sensor_integer_threshold_emit_critical(sensor);
				g_print("Critical\n");
			}
 			else if (state == LOWER_WARNING || state == UPPER_WARNING)
			{
 				sensor_integer_threshold_emit_warning(sensor);
				g_print("Warning\n");
			}
		}
	}
}

