#include <pthread.h>
#include "arc_model.h"
#include "arc_strategy.h"
#include "named_resource.h"

//to be replaced with an adaptation controller
#include "task_engine.h"

#ifndef KNOWLEDGE_BASE
#define KNOWLEDGE_BASE

#define ARC_KB_PLANS_INIT_MAX 16
#define ARC_KB_STRATS_INIT_MAX 16
#define ARC_KB_RES_INIT_MAX 32


/*TODO: Decide if we want to free res or not in the end.
  Right now calling knowledge_base_rem_res on something not allocated with malloc will corrupt memory
*/

struct knowledge_base
{
    /* The architectural model */
    struct arc_model *model;

    /* Resources */
    struct named_res **named_res;
    size_t num_res;
    size_t max_res; 

    /*Adaptation specifics*/
    struct arc_plan **known_plans;
    size_t num_plans;
    size_t max_plans;
    struct arc_strategy **known_strats;
    size_t num_strats;
    size_t max_strats;

};

void init_knowledge_base(struct knowledge_base *k_b, struct arc_model *model);
void destroy_knowledge_base(struct knowledge_base *k_b);

void knowledge_base_add_plan(struct knowledge_base *k_b, struct arc_plan *plan);
struct arc_plan* knowledge_base_get_plan(struct knowledge_base *k_b, char *plan_name);

void knowledge_base_add_strat(struct knowledge_base *k_b, struct arc_strategy *strat);
struct arc_strategy* knowledge_base_get_strat(struct knowledge_base *k_b, char *strat_name);

void knowledge_base_add_res(struct knowledge_base *k_b, struct named_res *named_res);
void* knowledge_base_get_res(struct knowledge_base *k_b, char *name);
void knowledge_base_rem_res(struct knowledge_base *k_b, char *name);
size_t knowledge_base_num_res(struct knowledge_base *k_b, char *name);

void knowledge_base_list_res(struct knowledge_base *k_b);

#endif