#include "main.h"

Resource *
resource_init(const char *res)
{
   Resource *r;
   
   r = calloc(1, sizeof(Resource));
   r->res = strdup(res);
   return r;
}

int
resource_state_request_add(Resource *r, const char *src, const char *state)
{
   int i;
   
   for (i = 0; i < r->reqs_num; i++)
     {
	if (!strcmp(r->reqs[i].src, src))
	  {
	     if (!strcmp(r->reqs[i].state, state))
	       return 0;
	     free(r->reqs[i].state);
	     r->reqs[i].state = strdup(state);
	     return 1;
	  }
     }
   r->reqs_num++;
   r->reqs = realloc(r->reqs, r->reqs_num * sizeof(Resource_Request));
   r->reqs[r->reqs_num - 1].src = strdup(src);
   r->reqs[r->reqs_num - 1].state = strdup(state);
   return 1;
}

int
resource_state_request_del(Resource *r, const char *src)
{
   int i;
   
   for (i = 0; i < r->reqs_num; i++)
     {
	if (!strcmp(r->reqs[i].src, src))
	  {
	     free(r->reqs[i].src);
	     free(r->reqs[i].state);
	     r->reqs_num--;
	     for (; i < r->reqs_num; i++)
	       {
		  r->reqs[i] = r->reqs[i + 1];
	       }
	     r->reqs = realloc(r->reqs, r->reqs_num * sizeof(Resource_Request));
	     return 1;
	  }
     }
   return 0;
}

const char *
resource_evaluate(Resource *r)
{
   int i;
   const char *state = "nothing";
   
   for (i = 0; i < r->reqs_num; i++)
     {
	if (!strcmp(r->reqs[i].state, "on"))
	  return "on";
	else if (!strcmp(r->reqs[i].state, "off"))
	  state = "off";
     }
   return state;
}

void
resource_state_requests_clear(Resource *r)
{
   int i;
   const char *state = "nothing";

   if (r->reqs)
     {
	for (i = 0; i < r->reqs_num; i++)
	  {
	     free(r->reqs[i].src);
	     free(r->reqs[i].state);
	  }
	free(r->reqs);
	r->reqs = NULL;
     }
   r->reqs_num = 0;
}
