#ifndef SCRIPTING_ENVIRONMENT_HPP
#define SCRIPTING_ENVIRONMENT_HPP

#include "extractor/profile_properties.hpp"
#include "extractor/raster_source.hpp"

#include "util/lua_util.hpp"

#include <string>
#include <memory>
#include <mutex>
#include <tbb/enumerable_thread_specific.h>

struct lua_State;

namespace osrm
{
namespace extractor
{

/**
 * Creates a lua context and binds osmium way, node and relation objects and
 * ExtractionWay and ExtractionNode to lua objects.
 *
 * Each thread has its own lua state which is implemented with thread specific
 * storage from TBB.
 */
class ScriptingEnvironment
{
  public:
    struct Context
    {
        ProfileProperties properties;
        SourceContainer sources;
        util::LuaState state;
    };

    explicit ScriptingEnvironment(const std::string &file_name);

    ScriptingEnvironment(const ScriptingEnvironment &) = delete;
    ScriptingEnvironment &operator=(const ScriptingEnvironment &) = delete;

    Context &GetContex();

  private:
    void InitContext(Context &context);
    std::mutex init_mutex;
    std::string file_name;
    tbb::enumerable_thread_specific<std::unique_ptr<Context>> script_contexts;
};
}
}

#endif /* SCRIPTING_ENVIRONMENT_HPP */