import sys
import subprocess
import time
import os

#import popplerqt5
from PyQt5 import QtCore, QtWidgets, QtGui
from os import walk


class MyWidget(QtWidgets.QWidget):

    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.setWindowTitle('Paperless')
        
        self.child_processes = []

        self.LetterCounter = 0
        self.PageCounter = 0
        self.LetterFolder = ""

        #mounting the NAS
        os.system('sudo mount -t cifs //where/ever /home/pi/DRIVE/share')

        #fetching the device name
        self.deviceName = subprocess.check_output(['scanadf','-L'])[8:29]

        self.genButtons()

        # show status of the Process
        self.Status = QtWidgets.QLabel(str(self.LetterCounter) + " Letters and " + str(self.PageCounter) + " Pages scanned")
        self.Status.setAlignment(QtCore.Qt.AlignCenter)
        self.Status.setFixedWidth(250)

        # add the pdf View
        self.pdfView = QtWidgets.QLabel(self)
        self.pdfView.setScaledContents(1)

        self.hbox = QtWidgets.QHBoxLayout()
        self.hbox.addStretch(1)
        self.hbox.addWidget(self.pdfView, 1)

        self.vbox = QtWidgets.QVBoxLayout()
        self.vbox.addStretch(1)

        # put everything together
        self.vbox.addWidget(self.Status, 1)
        self.vbox.addStretch(5)
        self.vbox.addWidget(self.nextLetter, 2)
        self.vbox.addWidget(self.nextPage, 2)
        self.vbox.addWidget(self.EndIt, 2)

        self.hbox.addLayout(self.vbox)

        self.setLayout(self.hbox)

    def genButtons(self):
        self.nextLetter = QtWidgets.QPushButton("Next Letter")
        self.nextPage = QtWidgets.QPushButton("First Page")
        self.EndIt = QtWidgets.QPushButton("End")

        self.nextLetter.setSizePolicy(
                QtWidgets.QSizePolicy.Preferred,
                QtWidgets.QSizePolicy.Expanding)

        self.nextPage.setSizePolicy(
                QtWidgets.QSizePolicy.Preferred,
                QtWidgets.QSizePolicy.Expanding)

        self.EndIt.setSizePolicy(
                QtWidgets.QSizePolicy.Preferred,
                QtWidgets.QSizePolicy.Expanding)

        self.nextLetter.clicked.connect(self.nextLetterAction)
        self.nextPage.clicked.connect(self.nextPageAction)
        self.EndIt.clicked.connect(self.endItAllAction)

        self.nextLetter.setEnabled(True)
        self.nextPage.setEnabled(False)
        self.EndIt.setEnabled(True)

    def nextPageAction(self):
        self.nextPage.setText('Next Page')
        self.nextPage.update()
        self.nextPage.setEnabled(False)
        
        outputFile = self.LetterFolder + "/page_" + str(self.PageCounter) + ".pdf"
        outputFile_ocr = self.LetterFolder + "/page_" + str(self.PageCounter) + "ocr.pdf"
        self.PageCounter += 1
        resolution = "300"
        mode = "Lineart"
            
        #scan one page...
        subprocess.check_output(['scanadf','--device-name' , self.deviceName ,'--output-file',outputFile,'--resolution',resolution,'--mode',mode,'-e','1'])
        # subprocess.check_output(["qpdfview","--quiet","--unique",outputFile])
        # and run the OCR in a parallel task
        p = subprocess.Popen(['ocrmypdf', '-l', 'deu', '--output-type','pdfa', '--image-dpi', '300', outputFile, outputFile_ocr])
        self.child_processes.append(p)
        
        # self.loadPDF("path")
        self.Status.setText(str(self.LetterCounter) + " Letters and " + str(self.PageCounter) + " Pages scanned")
        self.Status.update()
        self.nextPage.setEnabled(True)
        self.nextLetter.setEnabled(True)

    def nextLetterAction(self):
        self.nextLetter.setEnabled(False)
        self.nextPage.setEnabled(True)
        self.nextPage.setText('First Page')
        self.nextPage.update()

        #generating a folder Per letter
        self.LetterFolder = "temp_" + str(self.LetterCounter)
        self.PageCounter = 0
        self.LetterCounter += 1

        #just claening up the mess if nessesary
        subprocess.run(['rm','-r',self.LetterFolder])
        subprocess.check_output(['mkdir',self.LetterFolder])
       

    def endItAllAction(self):
        self.Status.setText("Waiting for the OCR")
        
        #wait for all OCR processes
        for cp in self.child_processes:
            cp.wait()
        
        self.Status.setText("cleaning Up")
        self.Status.update()
        fileCounter = 0
        
        nasPath = "/home/pi/DRIVE/share/where/ever/"

        #go over all folders and concat the stuff
        for (dirpath,dirname,filenames) in walk("./"):
            for dirs in dirname:
                if "temp_" in dirs:
                    #generating the timestamp for the final document
                    finalFileName = time.strftime("%Y%m%d_%s_") + str(fileCounter) + '.pdf'
                    fileCounter += 1
                
                    #sudo apt-get install poppler-utils
                    command = ['pdfunite']
            
                    for (dirpath,dirname,filenames) in walk(dirs):
                        filenames.sort()
                        for files in filenames:
                            if "ocr" in files:
                                command.append(dirs + "/" + files)
                    command.append(finalFileName)
                    subprocess.check_output(command)
                    subprocess.Popen(["sudo","mv",finalFileName,nasPath + finalFileName]) 
                    subprocess.Popen(["rm","-r", dirs])

        self.close()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    widget = MyWidget()
    #widget.showFullScreen()
    widget.show()
    sys.exit(app.exec_())
