#!/usr/bin/env python3

from typing import Iterator
import gi, os, pwd, re, locale, shutil, gettext, sys, locale

gi.require_version('Gtk', '3.0')

from gi.repository import Gtk as gtk, Gdk

from locale import gettext as _
locale.bindtextdomain('ubapphide', '/usr/share/locale/')
locale.textdomain('ubapphide')

#restart, if not root
if not os.geteuid() == 0:
    print(_("Attention: The script is started from the user, restart from root!"))
    os.execv('/usr/bin/pkexec', ['pkexec -W ignore'] + sys.argv)

class Main:
    def __init__(self):

        #define language
        self.language_sys=locale.getdefaultlocale()

        #connect glade file
        gladeFile = "/usr/share/ubapphide/ui/ubapphide.glade"
        self.builder = gtk.Builder()
        self.builder.add_from_file(gladeFile)
        self.builder.connect_signals(self)
        self.selected = None
        self.count_columns = 0

        provider = gtk.CssProvider()
        provider.load_from_path("/usr/share/ubapphide/css/ubapphide.css")

    ### set object  ###

        self.imgHdr = self.builder.get_object("headerPix")
        self.imgHdr.set_from_file("/usr/share/ubapphide/images/ubapphide_hdr.png")


        self.treeUseres = self.builder.get_object("treeUseres")
        self.listUsers = gtk.ListStore(str)

        self.treeApps = self.builder.get_object("treeApps")
        self.listApps = gtk.ListStore(str, str, str, str, str, bool)

        self.btnBox = self.builder.get_object("btnBox")
        self.btnBox.set_visible(False)

        #fill users tree
        self.loadUsers()
        #fill apps tree
        self.loadApps()

        self.popAdditionMenuSettings = self.builder.get_object("popAdditionMenuSettings")
        self.wndAbout = self.builder.get_object("wndAbout")
        self.wndAbout.connect("delete-event", self.on_destroy)

        #connect ro main window
        window = self.builder.get_object("mainWin")
        window.connect("delete-event", gtk.main_quit)

        gtk.StyleContext.add_provider_for_screen(
                Gdk.Screen.get_default(),
                provider,
                gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
        )

        #open main window
        window.show()

    def on_destroy(self, widget, *data):
        widget.hide()
        return True

    def show_addition_sett(self, button):
        self.popAdditionMenuSettings.show()

    def show_about(self, button):
        self.wndAbout.show()
        self.popAdditionMenuSettings.hide()

    #load users in list
    def loadUsers(self):
        pwdAll = pwd.getpwall()

        for list in pwdAll:
            if int(list[2]) >= 1000:
                if not 'nobody' in str(list[0]):
                    self.listUsers.append([list[0]])

        self.selected = self.listUsers[0][0]

        renderer = gtk.CellRendererText()
        userColumn = gtk.TreeViewColumn(title="Paths", cell_renderer=renderer, text=0)
        self.treeUseres.append_column(userColumn)
        self.treeUseres.set_model(self.listUsers)

    #event on click in user
    def setUser(self, widget, path, column):
        #get choose username
        selection = self.listUsers[path][0]

        #equate in public var and clear treeview
        if selection:
            self.selected = selection
            self.clear_list_apps()
            self.loadApps()

    #load apps in list
    def loadApps(self):
        self.count_columns=0

        #searching .desktop file
        if os.path.isdir('/home/' + self.selected + '/.local/share/applications'):
            files_user = os.listdir('/home/' + self.selected + '/.local/share/applications')
        else:
            os.makedirs('/home/' + self.selected + '/.local/share/applications')
            files_user=None
        if os.path.isdir("/usr/share/applications"):
            files = os.listdir("/usr/share/applications")
            self.addAppsInList(files, files_user, 0)
        if os.path.isdir("/usr/local/share/applications"):
            filesLocal = os.listdir("/usr/local/share/applications")
            self.addAppsInList(filesLocal, files_user, 1)

        #render firs column description
        px_renderer = gtk.CellRendererPixbuf()
        self.px_app_Column = gtk.TreeViewColumn(title=_("Icon"), cell_renderer=px_renderer, icon_name=0)
        self.px_app_Column.set_max_width(70)
        self.treeApps.append_column(self.px_app_Column)

        #render second column description
        path_renderer = gtk.CellRendererText()
        self.path_app_Column = gtk.TreeViewColumn(title=_("Path"), cell_renderer=path_renderer, text=1)
        self.path_app_Column.set_visible(False)
        self.treeApps.append_column(self.path_app_Column)

        #render second column description
        namFile_renderer = gtk.CellRendererText()
        self.nameFile_app_Column = gtk.TreeViewColumn(title=_("Name file"), cell_renderer=namFile_renderer, text=2)
        self.nameFile_app_Column.set_visible(False)
        self.treeApps.append_column(self.nameFile_app_Column)

        #render second column description
        name_renderer = gtk.CellRendererText()
        self.name_app_Column = gtk.TreeViewColumn(title=_("Name"), cell_renderer=name_renderer, text=3)
        self.name_app_Column.set_sort_column_id(3)
        self.name_app_Column.set_max_width(130)
        name_renderer.props.wrap_width = 125
        name_renderer.props.wrap_mode = gtk.WrapMode.WORD
        self.treeApps.append_column(self.name_app_Column)

        #render third column description
        desc_renderer = gtk.CellRendererText()
        self.desc_app_Column = gtk.TreeViewColumn(title=_("Description"), cell_renderer=desc_renderer, text=4)
        self.desc_app_Column.set_sort_column_id(4)
        self.desc_app_Column.set_max_width(305)
        desc_renderer.props.wrap_width = 300
        desc_renderer.props.wrap_mode = gtk.WrapMode.WORD
        self.treeApps.append_column(self.desc_app_Column)

        #render four column description
        lock_renderer = gtk.CellRendererToggle()
        lock_renderer.connect("toggled", self.on_cell_toggled)
        self.lock_app_Column = gtk.TreeViewColumn(title=_("Hide"), cell_renderer=lock_renderer, active=5)
        self.lock_app_Column.set_sort_column_id(5)
        self.treeApps.append_column(self.lock_app_Column)

        #fill gred
        self.treeApps.set_model(self.listApps)

    def addAppsInList(self, files, files_user, chkLocal):
        iter = self.count_columns
        hidden = None

        for file in files:
            if '.desktop' in file:
                if not '_' in file:
                    if chkLocal == 0:
                        path='/usr/share/applications/'
                        textfile_root = open(path+file)
                    else:
                        path='/usr/local/share/applications/'
                        textfile_root = open(path+file)

                    filetext_root = textfile_root.read()
                    textfile_root.close()

                    if files_user:
                        for file_user in files_user:
                            if '.desktop' in file_user:
                                if (file == file_user):
                                    hidden = True
                                    break
                                else:
                                    hidden = False
                    else:
                        hidden=False

                    icon = re.search(r"Icon=[a-zA-Z0-9\ \.\/\-_]*", filetext_root)

                    if str(self.language_sys[0]) == "ru_RU":
                        comment = re.search(r"Comment\[ru\]=[а-яА-Яa-zA-Z0-9\ \.\-_,\S]+", filetext_root)
                        name = re.search(r"Name\[ru\]=[а-яА-Яa-zA-Z0-9\ \.\-_,\S]*", filetext_root)
                        if not comment:
                            comment = re.search(r"Comment=[a-zA-Z0-9\ \.\-_,\S]+", filetext_root)
                        if not name:
                            name = re.search(r"Name=[а-яА-Яa-zA-Z0-9\ \.\-_,\S]*", filetext_root)
                    else:
                        comment = re.search(r"Comment=[a-zA-Z0-9\ \.\-_,\S]+", filetext_root)
                        name = re.search(r"Name=[а-яА-Яa-zA-Z0-9\ \.\-_,\S]*", filetext_root)

                    if icon:
                        icon_name = re.sub(r'\S+\=', '', icon.group(0))
                        if icon_name:
                            icn_str = icon_name
                        else:
                            icn_str = "yad"
                    else:
                        icn_str = "yad"

                    if name:
                        nm_str = re.sub(r'\S+\=', '', name.group(0))
                    else:
                        nm_str = ''

                    if comment:
                        cmmnt_str = re.sub(r'\S+\=', '', comment.group(0))
                    else:
                        if  re.search(r"GenericName\[ru\]=[а-яА-Яa-zA-Z0-9\ \.\-_,\S]+", filetext_root):
                            cmmnt_str = re.search(r"GenericName\[ru\]=[а-яА-Яa-zA-Z0-9\ \.\-_,\S]+", filetext_root)
                            if cmmnt_str:
                                cmmnt_str = re.sub(r'\S+\=', '', cmmnt_str.group(0))
                        elif re.search(r"GenericName=[а-яА-Яa-zA-Z0-9\ \.\-_,]+", filetext_root):
                            cmmnt_str = re.search(r"GenericName=[а-яА-Яa-zA-Z0-9\ \.\-_,\S]+", filetext_root)
                            if cmmnt_str:
                                cmmnt_str = re.sub(r'\S+\=', '', cmmnt_str.group(0))
                        else:
                            cmmnt_str=nm_str

                    iter += 1

                    if chkLocal == 0:
                        self.listApps.append([icn_str, path, file, nm_str, cmmnt_str, hidden])
                    else:
                        self.listApps.append([icn_str, path, file, nm_str, cmmnt_str, hidden])
        self.count_columns = iter

    #set activatable chekbox cell
    def on_cell_toggled(self, widget, path):
        #changing toggle
        self.listApps[path][5] = not self.listApps[path][5]

        #hide application
        if self.listApps[path][5]:
            shutil.copy2(str(self.listApps[path][1]) + str(self.listApps[path][2]), '/home/' + self.selected + '/.local/share/applications/' + str(self.listApps[path][2]))
            with open('/home/' + self.selected + '/.local/share/applications/' + str(self.listApps[path][2])) as f:
                old_data = f.read()

            icon = re.search(r"Icon=[a-zA-Z0-9\ \.\/\-_]*", old_data)
            if icon:
                icon_name = icon.group(0)
                new_data = old_data.replace(icon_name+'\n', icon_name+'\nHidden=true\n')
                with open ('/home/' + self.selected + '/.local/share/applications/' + str(self.listApps[path][2]), 'w') as fIn:
                    fIn.write(new_data)
            else:
                with open ('/home/' + self.selected + '/.local/share/applications/' + str(self.listApps[path][2]), 'a') as fIn:
                    fIn.write('\nHidden=true')
        else:
            os.remove('/home/' + self.selected + '/.local/share/applications/' + str(self.listApps[path][2]))

    #clear list and columns
    def clear_list_apps(self):
        self.listApps.clear()
        self.treeApps.set_model(model=None)
        self.treeApps.remove_column(self.px_app_Column)
        self.treeApps.remove_column(self.path_app_Column)
        self.treeApps.remove_column(self.nameFile_app_Column)
        self.treeApps.remove_column(self.name_app_Column)
        self.treeApps.remove_column(self.desc_app_Column)
        self.treeApps.remove_column(self.lock_app_Column)

    #action on chekbutton "Prohibit terminal"
    def toggle_prohibit_term(self, button):
        if button.get_active():
            print("active")
        else:
            print("disactive")

    #action on chekbutton "Prohibit usb"
    def toggle_prohibit_ubs(self, button):
        if button.get_active():
            print("active")
        else:
            print("disactive")

    def ShowAll(self, button):
        iter = 0
        while iter < self.count_columns:
            if (self.listApps[iter][5]):
                self.listApps[iter][5] = not self.listApps[iter][5]
                os.remove('/home/' + self.selected + '/.local/share/applications/' + str(self.listApps[iter][2]))
            iter += 1

    def HideAll(self, button):
        iter = 0
        while iter < self.count_columns:
            if (not self.listApps[iter][5]):
                self.listApps[iter][5] = not self.listApps[iter][5]
                shutil.copy2(str(self.listApps[iter][1]) + str(self.listApps[iter][2]), '/home/' + self.selected + '/.local/share/applications/' + str(self.listApps[iter][2]))
                with open('/home/' + self.selected + '/.local/share/applications/' + str(self.listApps[iter][2])) as f:
                    old_data = f.read()

                icon = re.search(r"Icon=[a-zA-Z0-9\ \.\/\-_]*", old_data)
                if icon:
                    icon_name = icon.group(0)
                    new_data = old_data.replace(icon_name+'\n', icon_name+'\nHidden=true\n')
                    with open ('/home/' + self.selected + '/.local/share/applications/' + str(self.listApps[iter][2]), 'w') as fIn:
                        fIn.write(new_data)
                else:
                    with open ('/home/' + self.selected + '/.local/share/applications/' + str(self.listApps[iter][2]), 'a') as fIn:
                        fIn.write('\nHidden=true')
            iter += 1



if __name__ == '__main__':
    main=Main()
    gtk.main()