#pragma once

#include <string>
#include <Python.h>

#include "machine.h"

class Eval_python
{
public:
    static std::regex statement_delimiter;
    explicit Eval_python(Machine& machine, const Locator& loc);
    Eval_python(const Eval_python&) = delete;
    Eval_python& operator=(const Eval_python&) = delete;
    ~Eval_python();
    void add_module_path(const std::string& path);
    std::vector<std::string> parse_modules(std::string code);
    void import_module(const std::string& module_name, bool verify = true);
    std::string get_result(PyObject* result_object);
    std::string eval_expression(const std::string& expression, bool import_modules = true);
    std::string eval_statements(const std::string& script);
    std::string eval(std::string code);
    //std::string eval_katom_list(const katom_iter& begin, const katom_iter& end);
    std::string eval_katom_list(
        std::vector<Katom>& katoms,
        const std::vector<Katom>::iterator& begin, const std::vector<Katom>::iterator& end);

    Machine m_machine;
    Locator m_loc;
    PyObject* m_globals;
    PyObject* m_locals;
};
