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

};

#endif /* PYTHONAPI_H */


