import glob
import inspect
import os

import sqlite3

import subprocess

import psutil
from PyQt6.QtWidgets import QWidget, QApplication, QMainWindow, QDockWidget, QListWidgetItem
from PyQt6.QtCore import Qt, pyqtSlot
from PyQt6.uic import loadUiType, loadUi
import sys
sys.path.append(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()) + "\\..\\..\\..")))
sys.path.append(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()) )))

from Projeler.QTBilesenleri.FikoBehemilPost.ITezgahlar import ITezgahlar

from DropMenu import QDropMenu
from KullaniciMenusu import QKullaniciMenusu
from SolMenu import QSolMenu
from TezgahSecimiMenu import QTezgahSecimiMenu
from IBehemilDB import IBehemilDB

__author__ = 'Pc-Pc'

ScriptYolu = os.path.dirname(os.path.abspath(
    inspect.getfile(inspect.currentframe())))

def KlasordekiDosyalar(Klasor, Uzantilar="*.*"):
    os.chdir(os.path.abspath(Klasor))
    List = []
    for files in glob.glob(Uzantilar):
        List.append(files)
    return List

def klasoruTemizle(klasoru, val=["log", "LOG", "MOAPTIndexes", "MOISOIndexes"]):
    for uzanti in val:
        dosyalar = KlasordekiDosyalar(klasoru, "*." + uzanti)
        for dosya in dosyalar:
            os.remove(dosya)


def programCalistir(Parametreler, PencereGoster=0):
    """ Herhangi Bir Programi Parametre İle Çalistirip Bitmesini BekleMEZ """
    info = subprocess.STARTUPINFO()
    info.dwFlags = 11
    info.wShowWindow = PencereGoster
    asd = subprocess.Popen(Parametreler, startupinfo=info, creationflags=subprocess.SW_HIDE)
    
    proc = psutil.Process(asd.pid)
    asd.communicate()
    # proc.set_nice(psutil.REALTIME_PRIORITY_CLASS)
    return proc


def dict_factory(cursor, row):
    d = {}
    for idx, col in enumerate(cursor.description):
        d[col[0]] = row[idx]
    return d


class QFikoYT(QMainWindow):
    def __init__(self, parent=None, widget=None):
        QMainWindow.__init__(self, parent)

        self.ScriptYolu = os.path.dirname(os.path.abspath(
            inspect.getfile(inspect.currentframe())))
        self.ui = loadUi(self.ScriptYolu + r'\\MainAnaPencere.ui', self)

        self.kMenu = QKullaniciMenusu(main=self)
        self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.kMenu)

        self.sMenu = QSolMenu(main=self)
        self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea, self.sMenu)

        self.sMenu2 = QDropMenu(main=self)
        self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea, self.sMenu2)

        self.tezgahMenu = QTezgahSecimiMenu(main=self)
        self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.tezgahMenu)
        # --->
        # --->
        self.__baglanti = None
        # self.__baglanti.row_factory = dict_factory
        # self.__kursor = self.__baglanti.cursor()
        self.__kokDizin = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()) + "\\..\\..\\.."))
        # --->
        self.sMenu.ui.listWidget.itemSelectionChanged.connect(lambda: self.seciliProgramDegisti())
        # --->
        self.tezgahlar = ITezgahlar()
        self.tezgahlariListele()

    @property
    def kokDizin(self):
        return self.__kokDizin

    @property
    def tumPostlar(self) -> list:
        self.__kursor.execute("""SELECT * FROM POSTLAR ORDER BY _id""")
        return [row for row in self.__kursor]

    def kayitlariListele(self):
        self.sMenu.ui.listWidget.clear()
        veri = self.tumPostlar
        for kyt in veri:
            item = QListWidgetItem("%s" % kyt["ISMI"])
            item.data = kyt
            self.sMenu.ui.listWidget.addItem(item)
        self.sMenu.lblToplamSayi.setText(str(len(veri)))

    def dosyaFikoVtSecildi(self, dosya):
        # baglanti Oluşturuluyor
        self._dosya = dosya
        self.__baglanti = sqlite3.connect(dosya)
        self.__baglanti.row_factory = dict_factory
        self.__kursor = self.__baglanti.cursor()
        # Drop Box Dosya Labeli
        self.sMenu2.ui.labelVtDosya.setText(os.path.basename(dosya).replace("." + dosya.split(".")[-1], ""))
        # Kayıtlar Listeleniyor
        self.kayitlariListele()

    def seciliProgramDegisti(self):
        self.sMenu.lblSeciliSayisi.setText(str(len(self.sMenu.listWidget.selectedItems())))
        # print(self.sMenu.listWidget.selectedItems()[0].data)

    def tezgahlariListele(self):
        self.tezgahMenu.ui.listWidget.clear()
        veri = self.tezgahlar.tezgahlarTumu
        for kyt in veri:
            item = QListWidgetItem("%s" % kyt.ismi)
            item.data = kyt
            self.tezgahMenu.ui.listWidget.addItem(item)

        # item = QListWidgetItem("%s" % sys.argv[1])
        # self.tezgahMenu.ui.listWidget.addItem(item)

    def ncUret(self, apt, cikti, tezgah):
        ncKuralDosyasıKlasoru = os.path.join(self.kokDizin, "Prg", "Post Yardimcilari", "Post Kurallari")
        ncCeviriciParametreler = "/v:4 /s:0 /c:4"
        ncCeviriciProgram = os.path.join(self.kokDizin, "Prg", "Post Yardimcilari", "FikoPost", "FikoPost.exe")
        # ncCeviriciProgram = r"C:\Program Files\Dassault Systemes\B20\win_b64\startup\Manufacturing\IMSPar\imspostw.exe"
        aptUzantisi = "FikoApt"
        ncAtikDosyaUzantilari = ["FikoApt", "log", "FikoApt_LOG", "LOG"]
        # --->
        kuralDosyasi = "\"" + os.path.join(self.kokDizin, ncKuralDosyasıKlasoru, tezgah.kuralDosyasi) + "\""
        aptDosyasi = "\"" + apt + "\""
        ciktiDosyasi = "\"" + cikti + "\""
        # --->
        parametreler = kuralDosyasi + " " + aptDosyasi + " " + ciktiDosyasi + " " + ncCeviriciParametreler
        # --->
        Popen_arg = ncCeviriciProgram + " " + parametreler
        return programCalistir(Popen_arg)

    def aptYaz(self, kodlar, ciktiDosyasi):
        with open(ciktiDosyasi, "wb") as output_file:
            output_file.write(kodlar)

    def ncleriUret(self):
        # Post Klasorleri Ayarlanıyor
        _ciktiKlasoru = os.path.join(os.path.dirname(self._dosya),"POSTLAR")
        print(_ciktiKlasoru)
        seciliTezgahlar = self.tezgahMenu.ui.listWidget.selectedItems()
        for itm in seciliTezgahlar:
            if not os.path.exists(os.path.join(_ciktiKlasoru, itm.data.ismi)):
                os.makedirs(os.path.join(_ciktiKlasoru, itm.data.ismi))
        # Aptler Yaziliyor
        seciliProgramlar = self.sMenu.ui.listWidget.selectedItems()
        for itm in seciliProgramlar:
            aptCiktisi = os.path.join(_ciktiKlasoru, itm.data["ISMI"]+".FikoApt")
            self.aptYaz(itm.data["KOD"], aptCiktisi)
            for tzgh in seciliTezgahlar:
                ncCiktisi = os.path.join(_ciktiKlasoru, tzgh.data.ismi, itm.data["ISMI"]+"."+tzgh.data.postUzantisi)
                self.ncUret(aptCiktisi, ncCiktisi, tzgh.data)
                if os.path.exists(os.path.join(_ciktiKlasoru, tzgh.data.ismi, itm.data["ISMI"]+".log")):
                    os.remove(os.path.join(_ciktiKlasoru, tzgh.data.ismi, itm.data["ISMI"]+".log"))
            os.remove(aptCiktisi)


    def postlariAlTiklandi(self):
        self.ncleriUret()

    def dosyaAptSourceSecildi(self, dosya):
        klasor=os.path.dirname(dosya)
        klasoruTemizle(klasor)
        dosyalar = KlasordekiDosyalar(klasor, "*.CATProcess")
        processIsmi = str(dosyalar[0]).replace(".CATProcess","")
        #--->
        aptlerDuzensiz =  KlasordekiDosyalar(klasor, "*.aptsource")
        # isim düzeltme
        for dosya in aptlerDuzensiz:
            renamedFile=str(dosya).replace(processIsmi+"_","")
            os.rename(dosya, os.path.join(os.path.dirname(dosya), renamedFile))
        #--->
        behemilDB = IBehemilDB(klasor, processIsmi)
        VTdosya = behemilDB.veriTabaniYarat()
        aptler = KlasordekiDosyalar(klasor, "*.aptsource")
        for apt in aptler:
            behemilDB.programEkle(str(apt).replace(".aptsource",""), apt)
        behemilDB.baglanti.close()
        self.dosyaFikoVtSecildi(VTdosya)
        for apt in aptler:
            os.remove(apt)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("fusion")

    behemil = QFikoYT()
    behemil.show()

    # if len(sys.argv)>0:
    #     if os.path.isdir(sys.argv[1].replace("'","")):
    #         klasor = os.path.abspath(sys.argv[1].replace("'", ""))
    #         aptlerDuzensiz = KlasordekiDosyalar(klasor, "*.aptsource")
    #         behemil.dosyaAptSourceSecildi(aptlerDuzensiz[0])

    sys.exit(app.exec())
