/*
 Copyright 2019 Alain Dargelas

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */

/*
 * File:   PythonAPI.h
 * Author: alain
 *
 * Created on May 13, 2017, 4:42 PM
 */

#ifndef PYTHONAPI_H
#define PYTHONAPI_H
#include "Python.h"

namespace SURELOG {

class SV3_1aPythonListener;
class FileContent;
class Design;

class PythonAPI {
 public:
  PythonAPI();
  PythonAPI(const PythonAPI& orig);
  virtual ~PythonAPI();
  /* Main interpreter (in main thread) */
  static void init(int argc, const char** argv);
  static void shutdown();
  static PyThreadState* getMainInterp() { return m_mainThreadState; }

  /* Per thread interpreters */
  static PyThreadState* initNewInterp();
  static void shutdown(PyThreadState* interp);

  static bool loadScript(std::string name, bool check = false);
  static std::string evalScript(std::string module, std::string function,
                                std::vector<std::string> args,
                                PyThreadState* interp);
  static void evalScript(std::string function, SV3_1aPythonListener* listener,
                         ParserRuleContext* ctx);
  static std::string getInvalidScriptString() { return m_invalidScriptResult; }
  static bool isListenerLoaded() { return m_listenerLoaded; }
  static std::string getListenerScript() { return m_listenerScript; }
  static void setListenerScript(std::string script) {
    m_listenerScript = script;
  }
  static bool evalScriptPerFile(std::string script, ErrorContainer* errors,
                                FileContent* fC, PyThreadState* interp);
  static bool evalScript(std::string script, Design* design);
  static void setStrictMode(bool mode) { m_strictMode = mode; }

 private:
  static void loadScriptsInInterp_();
  static bool loadScript_(std::string name, bool check = false);
  static std::string m_invalidScriptResult;
  static PyThreadState* m_mainThreadState;
  static std::string m_programPath;
  static bool m_listenerLoaded;
  static std::string m_listenerScript;
  static bool m_strictMode;
  static std::string m_builtinPath;
};

};  // namespace SURELOG

#endif /* PYTHONAPI_H */
