#!/usr/bin/env python3

import sys

from PyQt5.QtCore import pyqtSlot,  pyqtSignal,  QThread,  Qt
from PyQt5.QtWidgets import QApplication,  QMainWindow, QFileDialog
from PyQt5.QtGui import QFont
from binascii import hexlify

from Ui_UiForm import Ui_MainWindow as Ui
from WaitingSpinnerWidget import QtWaitingSpinner as Placeholder

from double_hash_512 import double_hash

class Worker(QThread):
    finished = pyqtSignal()
    set_label_1 = pyqtSignal(str)
    set_label_2 = pyqtSignal(str)
    set_label_3 = pyqtSignal(str)
    
    def __init__(self,  parent):
        super(Worker, self).__init__(parent)
        self.parent_obj = parent
        self.buffer = None
        
    def run(self):
        try:
            file=open(self.parent_obj.chosenFileName,"rb")
            self.buffer = bytearray(file.read())
            file.close()
        except IOError:
            self.set_label_1.emit("Could not open file " +  self.parent_obj.chosenFileName +  " for reading.")
            self.set_label_2.emit("Binary File Size")
            self.set_label_3.emit("Double Hash")

            self.finished.emit()
            return

        if (self.buffer is None):
            self.set_label_1.emit("Generic Error.")
            self.set_label_2.emit("Binary File Size")
            self.set_label_3.emit("Double Hash")

            self.finished.emit()
            return
            
        self.set_label_1.emit("File Name: " + self.parent_obj.chosenFileName)
        self.set_label_2.emit("Binary File Size: " +  str(len(self.buffer)))
        
        hash_512 = double_hash(self.buffer)
        self.set_label_3.emit("Double Hash:        " + str(hexlify(hash_512),  "ascii"))
        self.buffer = None

        self.finished.emit()


class appWindow(QMainWindow,  Ui):
    def __init__(self, parent=None):
        super(appWindow, self).__init__(parent)
        self.setupUi(self)
        
        self.chosenFileName = None
        self.pushButton.clicked.connect(self.ChooseFile)
        self.setFixedSize(1100, 280)
        
        self.setStyleSheet("""
            QMainWindow {
                border: 2px solid black;
                border-top-left-radius: 5px;
                border-top-right-radius: 25px;
                border-bottom-left-radius: 25px;
                border-bottom-right-radius: 5px;
                }
            """)
        
        self.spinner = Placeholder(True,  True,  parent = self)
        
        QApplication.clipboard().dataChanged.connect(self.DisplayClipboard)
    
    def keyPressEvent(self, e):
        if e.key() == Qt.Key_Escape:
            self.close()
        super(appWindow,  self).keyPressEvent(e)    # Re-throw!


    @pyqtSlot()
    def ChooseFile(self):
        (self.chosenFileName,  _) = QFileDialog.getOpenFileName(self,  "Open File")
        if (self.chosenFileName == ""):
            return

        self.spinner.move(self.pos() - self.spinner.rect().center())
        self.spinner.start()

        prior_clip = QApplication.clipboard().text()
        if (len(prior_clip) <= 128 and prior_clip.count('\n') < 1 and prior_clip.count('\r') < 1):
            self.label_4.setFont(QFont("Courier",  8))
            self.label_4.setText("Clipboard Contents: " + prior_clip)

        t = Worker(self)
        t.finished.connect(self.ReEnable)
        t.set_label_1.connect(self.Display_Label_1)
        t.set_label_2.connect(self.Display_Label_2)
        t.set_label_3.connect(self.Display_Label_3)
        t.start()

    @pyqtSlot()
    def DisplayClipboard(self):
        prior_clip = QApplication.clipboard().text()
        if (len(prior_clip) <= 128 and prior_clip.count('\n') < 1 and prior_clip.count('\r') < 1):
            self.label_4.setFont(QFont("Courier",  8))
            self.label_4.setText("Clipboard Contents: " + prior_clip)

    @pyqtSlot()
    def ReEnable(self):
        self.spinner.stop()

    @pyqtSlot(str)
    def Display_Label_1(self,  output):
        self.label.setText(output)
    
    @pyqtSlot(str)
    def Display_Label_2(self,  output):
        self.label_2.setText(output)
    
    @pyqtSlot(str)
    def Display_Label_3(self,  output):
        self.label_3.setFont(QFont("Courier",  8))
        self.label_3.setText(output)
    

def main():
    app = QApplication(sys.argv)
    window = appWindow()
    window.setWindowFlags(Qt.FramelessWindowHint)
    """
        To-Do:
        
        In a future version, window.setMask() will be called.
        
        This will cause the app window to have a non-rectangular shape on the screen.
        However, this will also require that a 1-bit .GIF File be included as a
        resource.
        
        Python files that are compiled resources will never be put on
        show-case under the "/text" folder of the Web-site.
        
        Therefore, that future version will only be available in the
        "/binaries" folder, in the files
        
        DoubleHashGUI_s.tar.gz and DoubleHashGUI_s.zip
        
    """
    window.show()
    app.exec()

if __name__ == "__main__":
    main()
