#ifndef SASS_CONTEXT_WRAPPER
#define SASS_CONTEXT_WRAPPER

#include <vector>
#include <memory>
#include <nan.h>
#include <stdlib.h>
#include <condition_variable>
#include <sass_context.h>
#include "custom_function_bridge.h"
#include "custom_importer_bridge.h"

#ifdef __cplusplus
extern "C" {
#endif

  using namespace v8;

  void compile_data(struct Sass_Data_Context* dctx);
  void compile_file(struct Sass_File_Context* fctx);
  void compile_it(uv_work_t* req);

  struct sass_context_wrapper {
    // binding related
    bool is_sync;
    void* cookie;
    char* file;
    char* include_path;
    char* out_file;
    char* source_map;
    char* source_map_root;
    char* linefeed;
    char* indent;

    // libsass related
    Sass_Data_Context* dctx;
    Sass_File_Context* fctx;

    // libuv related
    uv_async_t async;
    uv_work_t request;

    // v8 and nan related
    Persistent<Object> result;
    NanCallback* error_callback;
    NanCallback* success_callback;

    std::vector<std::shared_ptr<CustomFunctionBridge>> function_bridges;
    std::vector<std::shared_ptr<CustomImporterBridge>> importer_bridges;
  };

  struct sass_context_wrapper*      sass_make_context_wrapper(void);
  void sass_free_context_wrapper(struct sass_context_wrapper*);

#ifdef __cplusplus
}
#endif

#endif
