# Copyright 2015, Tresys Technology, LLC
#
# This file is part of SETools.
#
# SETools is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation, either version 2.1 of
# the License, or (at your option) any later version.
#
# SETools is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with SETools.  If not, see
# <http://www.gnu.org/licenses/>.
#

from PyQt5.QtCore import Qt, QAbstractTableModel, QModelIndex
from setools.policyrep.exception import RuleNotConditional, RuleUseError


class RuleResultModel(QAbstractTableModel):
    def __init__(self, parent):
        super(RuleResultModel, self).__init__(parent)
        self.resultlist = []

    def rowCount(self, parent=QModelIndex()):
        if self.resultlist:
            return len(self.resultlist)
        else:
            return 0

    def columnCount(self, parent=QModelIndex()):
        return 5

    def headerData(self, section, orientation, role):
        raise NotImplementedError

    def data(self, index, role):
        if role == Qt.DisplayRole:
            if not self.resultlist:
                return None

            row = index.row()
            col = index.column()

            if col == 0:
                return self.resultlist[row].ruletype
            elif col == 1:
                return str(self.resultlist[row].source)
            elif col == 2:
                return str(self.resultlist[row].target)
            elif col == 3:
                try:
                    return str(self.resultlist[row].tclass)
                except RuleUseError:
                    # role allow
                    return None
            elif col == 4:
                # most common: permissions
                try:
                    return ", ".join(sorted(self.resultlist[row].perms))
                except RuleUseError:
                    pass

                # next most common: default
                # TODO: figure out filename trans
                try:
                    return str(self.resultlist[row].default)
                except RuleUseError:
                    pass

                # least common: nothing (role allow)
                return None
            elif col == 5:
                try:
                    return str(self.resultlist[row].conditional)
                except RuleNotConditional:
                    return None
            else:
                raise ValueError("Invalid column number")
        elif role == Qt.UserRole:
            # get the whole rule for user role
            return self.resultlist[row].statement()


class TERuleListModel(RuleResultModel):

    """Type Enforcement rule model.  Represents rules as a column."""

    def columnCount(self, parent=QModelIndex()):
        return 6

    def headerData(self, section, orientation, role):
        if role == Qt.DisplayRole and orientation == Qt.Horizontal:
            if section == 0:
                return "Rule Type"
            elif section == 1:
                return "Source"
            elif section == 2:
                return "Target"
            elif section == 3:
                return "Object Class"
            elif section == 4:
                return "Permissons/Default Type"
            elif section == 5:
                return "Conditional Expression"
            else:
                raise ValueError("Invalid column number")
