#!/usr/bin/env python

from __future__ import print_function

import os
import sys
import signal
from pyutils.pygtksvnb import notebook
from gi.repository import GLib

import links_and_nodes as ln

new_nb_template = """%(auto_exec_prefix)s# this notebook is related to %(related_object_name)s!
# you can use this notebook to do tests, for debugging or for data analysis
%(teaser)s"""

class ln_notebook(object):
    def __init__(self, args):
        self.notebook_file = args[1]
        self.related_object_name = args[2]
        
        signal.signal(signal.SIGTERM, self.on_sigterm)
        prefix = "nb:"
        if "/" in self.related_object_name:
            client_name = self.related_object_name.split("/")
            client_name[-1] = prefix + client_name[-1]
            client_name = "/".join(client_name)
        else:
            client_name = prefix + self.related_object_name
        self.clnt = ln.client(client_name, args[2:])
        
        # register present_window
        self.present_window = self.clnt.get_service_provider(
            "ln.notebooks.%s.present_window" % (self.clnt.name), 
            "ln/present_window")
        self.present_window.set_handler(self.on_present_window)
        self.present_window.do_register("nb-group")
        self.clnt.handle_service_group_in_thread_pool("nb-group", "nb-pool")

        self.teaser = eval(os.getenv("NB_TEASER", "''"))
        no_auto_exec_prefix = "no_auto_exec\n"
        if self.teaser.startswith(no_auto_exec_prefix):
            self.teaser = self.teaser[len(no_auto_exec_prefix):]
            self.auto_exec_prefix = ""
        else:
            self.auto_exec_prefix = "## autoexec\n\n"
        
        self.nb = notebook(
            filename=self.notebook_file,
            new_notebook_cell_content=new_nb_template % self.__dict__,
            create_file=True,
            add_to_context=dict(
                ln_notebook=self,
                clnt=self.clnt
            )
        )
        #w.set_title("pyscope %s/%s" % (self.topic, self.value_name))
        self.w = self.nb.window
        self.nb.show()
        print("notebook ready")

    def on_present_window(self, svc, req, resp):
        #print("received present window request")
        def do_present():
            self.w.present()
            return False
        GLib.idle_add(do_present)
        svc.respond()
        return 0

    def handle_sigterm(self):
        self.nb.on_delete(self.nb.window, None)
    
    def on_sigterm(self, signo, frame):
        GLib.idle_add(self.handle_sigterm)
        
if __name__ == "__main__":
    nb = ln_notebook(sys.argv)
    nb.nb.run()
