/*
 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(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;
};

};  // namespace SURELOG

#endif /* PYTHONAPI_H */
