import sys,os,re,time
import numpy as np
from PyQt5 import QtWidgets, QtGui
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QMessageBox, QProgressDialog ,QWidget,QGridLayout,QPushButton,QLabel,QTextBrowser,QDesktopWidget,QProgressBar
from PyQt5.QtGui import *
from PyQt5 import QtCore
from PyQt5.QtCore import Qt, QThread, pyqtSignal 


class ExpMonitor(QThread):
    signal_ascent=pyqtSignal(list)
    exp_cmplt=pyqtSignal()
    setProgress=pyqtSignal(int)

#——————————————————————————————————#
    def __init__(self,xlist,ylist,zlist,maxval,textbrowser_log,monitee):
        super().__init__()
        self.xlist=xlist
        self.ylist=ylist
        self.zlist=zlist
        self.maxval=maxval-1
        self.ddif=[]
        self.monitee=monitee
        self.textbrowser_log=textbrowser_log
        for i in range(1,len(self.zlist)):
            self.ddif.append(self.zlist[i]-self.zlist[i-1])
        
#——————————————————————————————————#
    def run(self):
        n=0

        for i in range(len(self.xlist)):
            if i==0:
                xdif=self.xlist[i]-0
            else:
                xdif=self.xlist[i]-self.xlist[i-1]
                self.signal_ascent.emit([1,(0-self.ylist[-1])/1000])
                self.signal_ascent.emit([2,(0-self.zlist[-1])/1000])
            self.signal_ascent.emit([0,xdif/1000])
            for j in range(len(self.ylist)):
                if j==0:
                    ydif=self.ylist[j]-0
                else:
                    ydif=self.ylist[j]-self.ylist[j-1]
                    self.signal_ascent.emit([2,(0-self.zlist[-1])/1000])
                self.signal_ascent.emit([1,ydif/1000])
                for k in range(len(self.zlist)):
                    if k==0:
                        zdif=self.zlist[k]-0
                    else:
                        zdif=self.zlist[k]-self.zlist[k-1]
                    self.signal_ascent.emit([2,zdif/1000])
                    # start to monitor:
                    self.file = open(self.monitee, "r")
                    self.before=self.file.read()
                    self.file.close()
                    self.textbrowser_log.AddnRefresh('Monitor waiting...')
                    while True:
                        self.file = open(self.monitee, "r")
                        time.sleep(0.2)
                        self.after = self.file.read()
                        self.file.close()
                        # loop-terminate trigger
                        if self.before!=self.after:
                            n+=1
                            self.setProgress.emit(int(n/self.maxval*100))
                            self.textbrowser_log.AddnRefresh('One loop done')
                            break  
        self.exp_cmplt.emit()

class RenameMonitor(QThread):
    animation=pyqtSignal(str)
    def __init__(self,path,format_list,value_list):
        super().__init__()
        print('rename monitor starting')
        self.path=path
        self.format_list=format_list
        self.value_list=value_list
    def run(self):
        print('run func starting')
        for value in self.value_list:
            print(value)
            for symbol in self.format_list:
                print(symbol)
                self.animation.emit(str(value))
                print('signal emitted')
                flag=True
                while flag==True:
                    time.sleep(1)
                    filelist=os.listdir(self.path)
                    print('Rename func starting')
                    flag=self.Rename(filelist,symbol,value)
    def Rename(self,filelist,symbol,value):
        flag=True
        for file in filelist:
            print(file)
            if symbol in file:
                print('found')
                try:
                    print('trying')
                    newname=file.replace(symbol, str(value))
                    os.rename(self.path+os.sep+file,self.path+os.sep+newname)
                    flag=False
                    print('changed')
                except FileExistsError:
                    newname=file.replace('.txt', ' new.txt')
                    os.rename(self.path+os.sep+file,self.path+os.sep+newname)
                except FileNotFoundError:
                    pass
                except PermissionError:
                    pass
        return flag
