from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem
from PyQt5.QtGui import QColor


class RegTableWidget(QTableWidget):

    def __init__(self, parent=None):
        super(RegTableWidget, self).__init__(parent)
        self.regs = {}
        self.modified_regs = []
        self.filtered_regs = []

    def set_data(self, regs, modified_regs):
        """Sets table data and updates it"""
        if self.filtered_regs:
            temp_regs = {}
            for reg, value in regs.items():
                if reg in self.filtered_regs:
                    temp_regs[reg] = value
                regs = temp_regs
        self.regs = regs
        self.modified_regs = modified_regs
        self.update()

    def update(self):
        """Fills table with registers"""
        if self.rowCount() != len(self.regs):
            self.setRowCount(len(self.regs))
        if not self.regs:
            return

        i = 0
        for reg, value in self.regs.items():
            if self.filtered_regs and reg not in self.filtered_regs:
                continue
            self.setItem(i, 0, QTableWidgetItem(reg))
            if isinstance(value, int):
                self.setItem(i, 1, QTableWidgetItem(hex(value)))
                self.setItem(i, 2, QTableWidgetItem(str(value)))
            else:
                self.setItem(i, 1, QTableWidgetItem(value))
            if reg in self.modified_regs:
                self.item(i, 0).setBackground(QColor(100, 100, 150))
                self.item(i, 1).setBackground(QColor(100, 100, 150))
                self.item(i, 2).setBackground(QColor(100, 100, 150))
            i += 1

        if "eflags" in self.regs:
            eflags = self.regs["eflags"]
            flags = {
                "c": eflags & 1,           # carry
                "p": (eflags >> 2) & 1,    # parity
                # "a": (eflags >> 4) & 1,  # aux_carry
                "z": (eflags >> 6) & 1,    # zero
                "s": (eflags >> 7) & 1,    # sign
                # "d": (eflags >> 10) & 1, # direction
                # "o":  (eflags >> 11) & 1 # overflow
            }
            flags_text = f"C:{flags['c']} P:{flags['p']} Z:{flags['z']} S:{flags['s']}"
            self.setRowCount(i + 1)
            self.setItem(i, 0, QTableWidgetItem("flags"))
            self.setItem(i, 1, QTableWidgetItem(flags_text))