# !/usr/bin/env python3
import gi
import os

gi.require_version("Gtk", "3.0")
gi.require_version("GtkSource", "3.0")
from gi.repository import Gtk, Gdk, GtkSource
from gi.repository.GdkPixbuf import Pixbuf
import confignator
import sys
sys.path.append(confignator.get_option('paths', 'ccs'))
sys.path.append(os.path.join(confignator.get_option("paths", "Tst"), "testing_library/testlib"))
sys.path.append('/home/sebastian/CCS/Tst/testing_library/testlib')  # notwendig damit tm als Modul erkannt wird
import ccs_function_lib as cfl
import s2k_partypes as s2k

import time
import sys
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
import DBus_Basic


from typing import NamedTuple
import confignator
import gi
# print(sys.path)
import inspect


import tm

Verification_1 = "tm." + tm.get_tc_acknow.__name__ + str(inspect.signature((tm.get_tc_acknow)))
Verification_2 = "tm." + tm.await_tc_acknow.__name__ + str(inspect.signature((tm.await_tc_acknow)))
Verification_3 = "tm." + tm.get_5_1_tc_acknow.__name__ + str(inspect.signature((tm.get_5_1_tc_acknow)))
tc_identifier = "identified_tc = tm." + tm.get_tc_identifier.__name__ + str(inspect.signature((tm.get_tc_identifier)))
Verification_4 = "tm." + tm.get_frequency_of_hk.__name__ + str(inspect.signature((tm.get_frequency_of_hk)))
Verification_5 = "tm." + tm.get_dpu_mode.__name__ + str(inspect.signature((tm.get_dpu_mode)))
Verification_6 = "tm." + tm.get_packet_length.__name__ + str(inspect.signature((tm.get_packet_length)))
Verification_7 = "tm." + tm.get_version_number.__name__ + str(inspect.signature((tm.get_version_number)))
Verification_8 = "tm." + tm.get_data_of_last_tc.__name__ + str(inspect.signature((tm.get_data_of_last_tc)))
Verification_9 = "tm." + tm.verify_no_more_hk.__name__ + str(inspect.signature((tm.verify_no_more_hk)))




# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

# Descriptions

descr_8 = "Get Timestamp of TM before last TC, get IID of last TC, get first 4 bytes of TC raw data."
descr_9 = "Check if there are no more HK packets"



verification_list = [
    ("Get TC Verification", 1, 7, "descr", Verification_1),
    ("Await TC Verification", 1, 7, "descr", tc_identifier + "\n" + Verification_2),
    ("Get TC Verification", 5, 1, "descr", Verification_3),
    ("Get HK frequency", None, None, "descr", Verification_4),
    ("Get DPU Mode", None, None, "descr", Verification_5),
    ("Get Packet Length", None, None, "descr", Verification_6),
    ("Get Version Number", None, None, "descr", Verification_7),
    ("Get Data of last TC", None, None, descr_8, Verification_8),
    ("Test if there are no more HK packets", None, None, descr_9, Verification_9)
]






def translate_drag_data(data):


    translated = "kla"

    return translated


class VerificationTable(Gtk.Grid):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.set_size_request(500,500)


        self.grid = Gtk.Grid()
        self.grid.set_column_homogeneous(True)
        self.grid.set_row_homogeneous(True)
        self.add(self.grid)

        # Creating ListStore model
        self.verification_liststore = Gtk.ListStore(str, int, int, str, str)
        for verification_ref in verification_list:
            self. verification_liststore.append(list(verification_ref))
        self.current_filter_verification = None

        # Creating filter, feeding it with liststore model
        self.verification_filter = self.verification_liststore.filter_new()
        # setting the filter function
        self.verification_filter.set_visible_func(self.verification_filter_func)

        # Creating treeview
        self.treeview = Gtk.TreeView(model=self.verification_filter)
        for i, column_title in enumerate(
            ["Verification", "ST", "SST", "Description"]
        ):
            renderer = Gtk.CellRendererText()
            column = Gtk.TreeViewColumn(column_title, renderer, text=i)
            self.treeview.append_column(column)

        # setting up layout
        self.scrollable_treelist = Gtk.ScrolledWindow()
        self.scrollable_treelist.set_vexpand(True)
        self.scrollable_treelist.set_hexpand(True)
        self.grid.attach(self.scrollable_treelist, 0, 0, 8, 10)
        self.scrollable_treelist.add(self.treeview)


        # handle selection
        self.selected_row = self.treeview.get_selection()
        self.selected_row.connect("changed", self.item_selected)


        # Set up Drag and Drop
        self.treeview.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.COPY)
        self.treeview.drag_source_set_target_list(None)
        self.treeview.drag_source_add_text_targets()

        self.treeview.connect("drag-data-get", self.on_drag_data_get)
        self.treeview.connect("drag-begin", self.on_drag_begin)

        self.show_all()

    def verification_filter_func(self, model, iter, data):
        if(
                self.current_filter_verification is None
                or self.current_filter_verification == "None"
        ):
            return True
        else:
            return model[iter][2] == self.current_filter_verification






    # drag and drop

    def item_selected(self, selection):
        model, row = selection.get_selected()
        if row is not None:

            global verification_name
            global ST
            global SST
            global descr
            global name_string

            verification_name = model[row][0]
            ST = model[row][1]
            SST = model[row][2]
            descr = model[row][3]
            name_string = model[row][4]

            global selected_data_for_drag_drop
            # print(verification_name)
            # print(name_string)

            selected_data_for_drag_drop = name_string
            # selected_data_for_drag_drop = cfl.verification_template(name_string)
                # str(verification_name) + "\n ST = " + str(ST) + "\n SST = " + str(SST) + "\n Time = 2"
            # selected_data_for_drag_drop = "{} ({}, {})".format((name, ST, SST))

        else:
            pass




    def on_drag_data_get(self, treeview, drag_context, selection_data, info, time, *args):
        treeselection = treeview.get_selection()
        model, my_iter = treeselection.get_selected()
        global selected_data_for_drag_drop
        selection_data.set_text(selected_data_for_drag_drop, -1)




    def on_drag_begin(self, *args):
        pass