#!/usr/bin/python3

import os
import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QWidget, QTabWidget, QVBoxLayout, QTableWidget, \
    QTableWidgetItem, QHeaderView, QGridLayout, QMessageBox, QAbstractItemView, QHBoxLayout, QCheckBox, QTableView

version = '1.1'


class MyTableWidgetItem(QWidget, QTableWidgetItem):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QHBoxLayout()
        self.setLayout(layout)
        self.checkbox = QCheckBox()
        layout.addWidget(self.checkbox)
        layout.setAlignment(Qt.AlignCenter)

    def __lt__(self, other):
        return int(self.checkbox.checkState()) < int(other.checkbox.checkState())


class Sortable_Table_Item(QTableWidgetItem):
    def __lt__(self, other):
        return int(self.whatsThis()) < int(other.whatsThis())


# Creating tab widgets
class MyTabWidget(QWidget):
    def write_settings(self):
        current_tab_index = self.tabs.currentIndex()
        inp = open(os.path.expanduser('~') + "/.config/kdeglobals", 'r')
        lines = inp.readlines()

        section = False
        settings_wrote = False
        prev_line = 'line'
        writing_values = ('false', 'particularly', 'true')
        new_lines = []
        for line in lines:
            if self.section_headers[current_tab_index] in line:
                section = True
                if prev_line.strip() != '':
                    new_lines.append('')
                new_lines.append(line)
                for j in range(self.tables[current_tab_index].rowCount()):
                    s = self.tables[current_tab_index].item(j, 0).text() + '=' + \
                        writing_values[self.tables[current_tab_index].cellWidget(j, 2).checkbox.checkState()]
                    new_lines.append(s)
                new_lines.append('')
                settings_wrote = True
            elif '[' in line:
                section = False
            if not section:
                new_lines.append(line.strip())
            prev_line = line
        if not settings_wrote:
            if not prev_line.strip() == '':
                new_lines.append('')
            new_lines.append(self.section_headers[current_tab_index])
            for j in range(self.tables[current_tab_index].rowCount()):
                s = self.tables[current_tab_index].item(j, 0).text() + '=' + \
                    writing_values[self.tables[current_tab_index].cellWidget(j, 2).checkbox.checkState()]
                new_lines.append(s)
        inp.close()
        with open(os.path.expanduser('~') + "/.config/kdeglobals", 'w') as out:
            for line in new_lines:
                print(line, file=out)
        dlg = QMessageBox(self)
        dlg.setWindowTitle("Уведомление")
        dlg.setText("Сохранено успешно.")
        dlg.exec()

    def cellClicked(self):
        counter = self.tabs.currentIndex()
        if self.tables[counter].currentColumn() == 2:
            self.tables[counter].setSortingEnabled(False)
            row = self.tables[counter].currentRow()
            self.tables[counter].cellWidget(row, 2).checkbox.nextCheckState()
            self.tables[counter].item(row, 2).setWhatsThis(
                str(self.tables[counter].cellWidget(row, 2).checkbox.checkState()))

    def checkbox_clicked(self):
        counter = self.tabs.currentIndex()
        self.tables[counter].setSortingEnabled(False)
        for row in range(self.tables[counter].rowCount()):
            self.tables[counter].item(row, 2).setWhatsThis(
                str(self.tables[counter].cellWidget(row, 2).checkbox.checkState()))

    def enable_sorting(self):
        counter = self.tabs.currentIndex()
        self.tables[counter].setSortingEnabled(True)

    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        self.layout = QVBoxLayout()

        # Initialize tab screen
        self.tabs = QTabWidget()
        self.tab1 = QWidget()
        self.tab2 = QWidget()
        self.tab3 = QWidget()
        self.tabs.resize(300, 200)

        # Add tabs
        self.tabs.addTab(self.tab1, "Action Restrictions")
        self.tabs.addTab(self.tab2, "Control Restrictions")
        self.tabs.addTab(self.tab3, "Resourse Restrictions")

        # Create tabs
        self.section_headers = ["[KDE Action Restrictions]", "[KDE Control Module Restrictions]",
                                "[KDE Resource Restrictions]"]
        self.action_table = QTableWidget()
        self.control_table = QTableWidget()
        self.resourse_table = QTableWidget()
        self.tables = [self.action_table, self.control_table, self.resourse_table]
        txt_files_folder = '/usr/share/kde-restrictions-gui'
        self.source_files = [
            f"{txt_files_folder}/action.txt",
            f"{txt_files_folder}/control.txt",
            f"{txt_files_folder}/resourse.txt"
        ]
        self.tabs_list = [self.tab1, self.tab2, self.tab3]

        values_from_kdeglobals = dict()
        with open(os.path.expanduser('~') + "/.config/kdeglobals", 'r') as inp:
            lines = inp.readlines()
            for line in lines:
                if '=' in line:
                    key, value = line.split('=')
                    if value.strip() in ('true', 'false'):
                        values_from_kdeglobals[key.strip()] = 2 if value.strip() == 'true' else 0

        for counter in range(3):
            self.tabs_list[counter].layout = QGridLayout(self)
            action_lines = open(self.source_files[counter], "r").readlines()
            self.tables[counter].setColumnCount(3)
            self.tables[counter].setRowCount(len(action_lines))
            self.tables[counter].setHorizontalHeaderLabels(("Ключ", "Команда", "Доступно"))
            self.tables[counter].horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)
            self.tables[counter].horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
            self.tables[counter].horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)

            self.tables[counter].setSortingEnabled(True)
            self.tables[counter].setEditTriggers(QAbstractItemView.NoEditTriggers)

            for i in range(len(action_lines)):
                action_table_values = action_lines[i].split(';')
                self.tables[counter].setItem(i, 0, QTableWidgetItem(action_table_values[0]))
                self.tables[counter].setItem(i, 1, QTableWidgetItem(action_table_values[1]))

                checkbox_widget = MyTableWidgetItem()
                checkbox_widget.checkbox.setCheckState(2)

                self.tables[counter].setItem(i, 2, Sortable_Table_Item(""))
                self.tables[counter].item(i, 2).setWhatsThis("2")
                if action_table_values[0] in values_from_kdeglobals.keys():
                    checkbox_widget.checkbox.setCheckState(values_from_kdeglobals[action_table_values[0]])
                    self.tables[counter].item(i, 2).setWhatsThis(str(values_from_kdeglobals[action_table_values[0]]))

                self.tables[counter].setCellWidget(i, 2, checkbox_widget)
                self.tables[counter].cellWidget(i, 2).checkbox.clicked.connect(self.checkbox_clicked)
            self.tables[counter].cellClicked.connect(self.cellClicked)
            self.tables[counter].horizontalHeader().sectionClicked.connect(self.enable_sorting)
            self.tabs_list[counter].layout.addWidget(self.tables[counter], 0, 0)
            save_actions_button = QPushButton("Сохранить")
            save_actions_button.clicked.connect(self.write_settings)
            self.tabs_list[counter].layout.addWidget(save_actions_button)
            self.tabs_list[counter].setLayout(self.tabs_list[counter].layout)

        # Add tabs to widget
        self.layout.addWidget(self.tabs)
        self.setLayout(self.layout)


# Creating the main window
class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = f'KDE Restrictions ver. {version}'
        self.left = 500
        self.top = 400
        self.width = 800
        self.height = 400
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.tab_widget = MyTabWidget(self)
        self.setCentralWidget(self.tab_widget)

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
