import inspect
import os
import sys
from os.path import join

import win32com.client
from PyQt6.QtCore import pyqtProperty
from PyQt6.QtCore import pyqtSlot, QVariant, Qt, pyqtSignal
from PyQt6.QtGui import QMovie
from PyQt6.QtWidgets import QMainWindow, QApplication
from PyQt6.uic import loadUi

sys.path.append(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()) + "\\..\\..")))

from IFikatia import IFikatia
from IDokuman import IDokuman
from IProcessDokuman import IProcessDokuman
from IProgram import IProgram
from IDialoglar.IFikoAktiviteAyirici.threadManager import Async

global iptal
iptal = False


class IFikoAktiviteAyirici(QMainWindow):
    sinyal = pyqtSignal(str, QVariant)

    def __init__(self, parent=None, flags=0, Catia=None):
        self.__fikatia = IFikatia(obj=Catia)
        self.__dokuman = self.__fikatia.aktifDokuman
        self.app = QApplication([sys.argv])

        super(IFikoAktiviteAyirici, self).__init__()

        self.ScriptYolu = os.path.dirname(os.path.abspath(
                inspect.getfile(inspect.currentframe())))
        self.ui = loadUi(self.ScriptYolu + r'\\formAna.ui', self)
        self.app.setStyle("fusion")
        self.setWindowFlags(Qt.WindowType.Window | Qt.WindowType.WindowCloseButtonHint | Qt.WindowType.CustomizeWindowHint | Qt.WindowType.WindowStaysOnTopHint)

        # AÇIKLAMA Logo Animasyon
        lbl = self.ui.labelResimProfil
        movie = QMovie(os.path.join(self.ScriptYolu, "Resimler", "kutuk.gif"))
        lbl.setMovie(movie)
        lbl.show()
        movie.start()

        # AÇIKLAMA Logo Animasyon
        lbl = self.ui.labelLogo
        movie = QMovie(os.path.join(self.ScriptYolu, "Resimler", "hiper.gif"))
        lbl.setMovie(movie)
        lbl.show()
        movie.start()

        # AÇIKLAMA İndicatör Animasyon
        lbl = self.ui.labelMesgulLogo
        movie = QMovie(join(self.ScriptYolu, "Resimler", "load1.gif"))
        lbl.setMovie(movie)
        lbl.show()
        movie.start()

        self.sinyal.connect(self.sinyalGeldi)

        self.ui.checkTakimDegisimleriniTasi.setHidden(True)
        # --->
        self.__ilkAktiviteKalsin = True
        self.__takimDegisimleriniTasi = False
        self.__orjinalProgramiKoru = False

    def sinyalGeldi(self, ismi, params=None):
        global iptal
        if ismi == "Tamamlandı":
            __process.anaProgram.hsoSenkronize = True
            __process.anaProgram.ekraniTazele = True
            self.ui.stackedWidget.setCurrentIndex(0)
            iptal = False

    @pyqtSlot()
    def show(self):
        super(IFikoAktiviteAyirici, self).show()

    @pyqtSlot()
    def closeEvent(self, *args, **kwargs):
        super(IFikoAktiviteAyirici, self).closeEvent(*args, **kwargs)

    @pyqtSlot()
    def on_btnCikis_clicked(self):
        self.close()

    @pyqtSlot()
    def on_btnCatiaAktifEt_clicked(self):
        @Async()
        def aktifEt(fikatia, sinyal=self.sinyal):
            dokuman = IFikatia(obj=fikatia)
            dokuman.aktifEt()
            sinyal.emit("uyariGoster", { "uyari": "Catia Aktif Edildi", "sinif": "uyariBasarili" })

        # --->
        aktifEt(self.__fikatia)
        # self.__fikatia.aktifEt()
        print("Catia Aktif Et Tıklandı")

    @pyqtSlot()
    def on_btnKlasorAc_clicked(self):
        @Async()
        def klasorAc(dokuman, sinyal=self.sinyal):
            dokuman = IDokuman(obj=dokuman, sahip=IFikatia(obj=dokuman.parent))
            dokuman.klasoruAcSecimli()
            sinyal.emit("uyariGoster", { "uyari": "Döküman Klasörü Açıldı", "sinif": "uyariBasarili" })

        # --->
        klasorAc(self.__dokuman)
        print("Catia Klasör Aç Tıklandı")

    @pyqtProperty(QVariant)
    def seciliPrg(self) -> IProgram:
        return self.__seciliPrg

    @seciliPrg.setter
    def seciliPrg(self, value: IProgram):
        self.__seciliPrg = value

        if value:
            self.ui.textPrg.setProperty("hata", False)
            self.ui.textPrg.setText(value.ismi)
            self.ui.labelOlusacakProgramSayisi.setText(str(value.aktiviteler.sayisi) + " Adet Program Oluşacak")
            self.ui.btnBasla.setEnabled(True)
        else:
            self.ui.textPrg.setProperty("hata", True)
            self.ui.textPrg.setText("")
            self.ui.labelOlusacakProgramSayisi.setText("")
            self.ui.btnBasla.setEnabled(False)
        self.ui.textPrg.setStyle(QApplication.style())

    @pyqtSlot()
    def on_btnPrgSec_clicked(self):
        self.setVisible(False)
        try:
            self.__fikatia.durumCubugu = "Lütfen Program Seçiniz"
            durum = self.__dokuman.secililer.sec2(["ManufacturingProgram"], Mesaj="Lütfen Programı Seçiniz...")
            if durum == "Normal":
                catSecililer = self.__dokuman.secililer
                catNesne = IProgram(obj=catSecililer.item2(0).nesne.catNesne)
                self.seciliPrg = catNesne

                self.setVisible(True)
            else:
                self.setVisible(True)
                self.__fikatia.durumCubugu = "Program Seçimi İptal Edildi"
                self.seciliPrg = None
        except:
            self.setVisible(True)
            self.seciliPrg = None

    @pyqtSlot()
    def on_btnIptal_clicked(self):
        global iptal
        iptal = True
        self.ui.stackedWidget.setCurrentIndex(0)

    @pyqtSlot()
    def on_btnPrgSil_clicked(self):
        self.seciliPrg = None

    @pyqtSlot(bool)
    def on_checkPrograminOrjinaliniKoru_toggled(self, value):
        self.orjinalProgramiKoru = value

    @pyqtSlot(bool)
    def on_checkIlkAktiviteKalsin_toggled(self, value):
        self.ilkAktiviteKalsin = value

    @pyqtSlot(bool)
    def on_checkTakimDegisimleriniTasi_toggled(self, value):
        self.takimDegisimleriniTasi = value

    @pyqtSlot()
    def on_btnBasla_clicked(self):
        @Async()
        def basla(dokuman, seciliPrg, ilkAktiviteKalsin, takimDegisimleriniTasi, orjinalProgramiKoru,
                  sinyal=self.sinyal):
            global iptal
            __process = IProcessDokuman(obj=dokuman, sahip=IFikatia(obj=dokuman.application))
            __process.anaProgram.hsoSenkronize = False
            __process.anaProgram.ekraniTazele = False
            __secililer = __process.secililer
            if orjinalProgramiKoru:
                __secililer.temizle()
                __secililer.ekle(seciliPrg)
                __secililer.kopyala()
                __secililer.yapistir()
                __seciliPrg = IProgram(obj=__secililer.item2(0).nesne.catNesne)
            else:
                __seciliPrg = IProgram(obj=seciliPrg)
            sinyal.emit("uyariGoster", { "mesaj": "Hazırlanıyor", "max": __seciliPrg.aktiviteler.sayisi, "value": 0 })

            for akt in reversed(range(__seciliPrg.aktiviteler.sayisi)):
                if __seciliPrg.aktiviteler[akt].turu != "ToolChange":
                    if ilkAktiviteKalsin:
                        if akt > 1:
                            sinyal.emit("uyariGoster", { "mesaj": "Oluşturuluyor", "value": akt })
                            __secililer.temizle()
                            __secililer.ekle(__seciliPrg.aktiviteler[akt])
                            __secililer.kes()
                            __secililer.temizle()
                            __secililer.ekle(__seciliPrg)
                            __process.anaProgram.komut("Manufacturing Program")
                            __secililer.yapistir()
                    else:
                        sinyal.emit("uyariGoster", { "mesaj": "Oluşturuluyor", "value": akt })
                        __secililer.temizle()
                        __secililer.ekle(__seciliPrg.aktiviteler[akt])
                        __secililer.kes()
                        __secililer.temizle()
                        __secililer.ekle(__seciliPrg)
                        __process.anaProgram.komut("Manufacturing Program")
                        __secililer.yapistir()
                else:
                    sinyal.emit("uyariGoster", { "mesaj": "Oluşturuluyor", "value": akt })
                if iptal:
                    iptal = False
                    exit()

            iptal = False
            sinyal.emit("Tamamlandı", { })

        # --->
        basla(self.__dokuman.asProcessDokuman, self.seciliPrg.catNesne, self.ilkAktiviteKalsin, self.takimDegisimleriniTasi,
              self.orjinalProgramiKoru,self.sinyal)

    @property
    def ilkAktiviteKalsin(self) -> bool:
        return self.__ilkAktiviteKalsin

    @ilkAktiviteKalsin.setter
    def ilkAktiviteKalsin(self, value: bool):
        self.__ilkAktiviteKalsin = value

    @property
    def takimDegisimleriniTasi(self) -> bool:
        return self.__takimDegisimleriniTasi

    @takimDegisimleriniTasi.setter
    def takimDegisimleriniTasi(self, value: bool):
        self.__takimDegisimleriniTasi = value

    @property
    def orjinalProgramiKoru(self) -> bool:
        return self.__orjinalProgramiKoru

    @orjinalProgramiKoru.setter
    def orjinalProgramiKoru(self, value: bool):
        self.__orjinalProgramiKoru = value


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("fusion")

    prflPrg = IFikoAktiviteAyirici(Catia=win32com.client.Dispatch("Catia.Application"))
    prflPrg.show()

    sys.exit(app.exec())
