#include "arc_property.h"
#include "arc_system.h"
#include "arc_value.h"

#include <stdbool.h>

#ifndef ARC_CONDITION
#define ARC_CONDITION

enum ARC_COMPARISON_OPERATOR{ARC_COND_LT=0,ARC_COND_LE,ARC_COND_GT,ARC_COND_GE,ARC_COND_EQ,ARC_COND_INVALID};
enum ARC_BOOLEAN_OPERATOR{ARC_COND_OR=0, ARC_COND_AND};

struct arc_simple_condition
{
    struct arc_property *prop;
    enum ARC_COMPARISON_OPERATOR op;
    union
    {
	int v_int;
	double v_dbl;
	char *v_str;
    };
};

struct arc_complex_condition
{
    struct arc_simple_condition *simple_conds;
    //N-1 operators
    enum ARC_BOOLEAN_OPERATOR *ops;
    size_t num_simple_conditions;
};


void init_simple_condition(struct arc_simple_condition *cond,
			   struct arc_property *prop,
			   enum ARC_COMPARISON_OPERATOR op,
			   struct arc_value value);

void destroy_simple_condition(struct arc_simple_condition *cond);

bool arc_simple_cond_eval(struct arc_simple_condition *cond, struct arc_system *sys);

void init_complext_condition(struct arc_complex_condition *cond,
			     struct arc_simple_condition *simple_conds,
			     enum ARC_BOOLEAN_OPERATOR *ops,
			     size_t num_simple_conditions);

bool arc_complex_cond_eval(struct arc_complex_condition *cond, struct arc_system *sys);
void destroy_complex_condition(struct arc_complex_condition *cond);


#endif