﻿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 IAktiviteler import IAktivite
from IDialoglar.IFikoDokumantasyon.threadManager import Async
import time

global iptal
iptal = False


class IFikoProfilPrgAlistirma(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(IFikoProfilPrgAlistirma, 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.__mevcutOffset = 0.0
        self.__sonOffset = 0.0
        self.__kademeOffset = 0.050

    def sinyalGeldi(self, ismi, params=None):
        global iptal
        if ismi == "uyariGoster":
            self.ui.stackedWidget.setCurrentIndex(1)
            self.ui.progressMesgul.setMaximum(
                    self.ui.progressMesgul.maximum() if not "max" in params else params["max"])
            self.ui.progressMesgul.setValue(
                    self.ui.progressMesgul.value() if not "value" in params else params["value"])
            self.ui.labelMesgul.setText(self.ui.labelMesgul.text() if not "mesaj" in params else params["mesaj"])
        if ismi == "Tamamlandı":
            self.ui.stackedWidget.setCurrentIndex(0)
            iptal=False

    def show(self):
        super(IFikoProfilPrgAlistirma, self).show()

    def closeEvent(self, *args, **kwargs):
        super(IFikoProfilPrgAlistirma, 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)
        # self.__fikatia.aktifDokuman.klasoruAcSecimli()
        print("Catia Klasör Aç Tıklandı")

    @pyqtProperty(float)
    def mevcutOffset(self) -> float:
        return self.__mevcutOffset

    @mevcutOffset.setter
    def mevcutOffset(self, value: float):
        self.__mevcutOffset = round(value, 3)
        if self.seciliAktivite:
            self.seciliAktivite.parametreler["Offset on Contour"].degeri = self.spinMevcutOffset.value()
            # self.seciliAktivite.parametreler["Offset on part"].degeri = self.spinMevcutOffset.value()
        if self.__sonOffset >= self.__mevcutOffset:
            self.ui.spinMevcutOffset.setProperty("hata", True)
            self.ui.spinSonOffset.setProperty("hata", True)
        else:
            self.ui.spinSonOffset.setProperty("hata", False)
            self.ui.spinMevcutOffset.setProperty("hata", False)

        self.ui.spinSonOffset.setStyle(QApplication.style())
        self.ui.spinMevcutOffset.setStyle(QApplication.style())
        self.offsetlerDegisti()
        if self.kademeOffset > self.mevcutOffset:
            self.ui.spinMevcutOffset.setProperty("hata", True)
            self.ui.spinKademeOffset.setProperty("hata", True)
        else:
            self.ui.spinMevcutOffset.setProperty("hata", False)
            self.ui.spinKademeOffset.setProperty("hata", False)
        self.ui.spinMevcutOffset.setStyle(QApplication.style())
        self.ui.spinKademeOffset.setStyle(QApplication.style())

    @pyqtProperty(float)
    def sonOffset(self) -> float:
        return self.__sonOffset

    @sonOffset.setter
    def sonOffset(self, value: float):
        self.__sonOffset = round(value, 3)
        if self.__sonOffset >= self.__mevcutOffset:
            self.ui.spinMevcutOffset.setProperty("hata", True)
            self.ui.spinSonOffset.setProperty("hata", True)
        else:
            self.ui.spinSonOffset.setProperty("hata", False)
            self.ui.spinMevcutOffset.setProperty("hata", False)

        self.ui.spinSonOffset.setStyle(QApplication.style())
        self.ui.spinMevcutOffset.setStyle(QApplication.style())
        self.offsetlerDegisti()

    @pyqtProperty(float)
    def kademeOffset(self) -> float:
        return self.__kademeOffset

    @kademeOffset.setter
    def kademeOffset(self, value: float):
        self.__kademeOffset = round(value, 3)
        self.offsetlerDegisti()
        if self.kademeOffset > self.mevcutOffset:
            self.ui.spinMevcutOffset.setProperty("hata", True)
            self.ui.spinKademeOffset.setProperty("hata", True)
        else:
            self.ui.spinMevcutOffset.setProperty("hata", False)
            self.ui.spinKademeOffset.setProperty("hata", False)
        self.ui.spinMevcutOffset.setStyle(QApplication.style())
        self.ui.spinKademeOffset.setStyle(QApplication.style())

    @pyqtProperty(QVariant)
    def seciliAktivite(self) -> IAktivite.IAktivite:
        return self.__seciliAktivite

    @seciliAktivite.setter
    def seciliAktivite(self, value: IAktivite.IAktivite):
        self.__seciliAktivite = value

        if value:
            self.ui.textAktivite.setProperty("hata", False)
            self.ui.textAktivite.setText(value.ismi)
            self.ui.groupOffsetler.setEnabled(True)
            self.ui.btnBasla.setEnabled(True)
        else:
            self.ui.textAktivite.setProperty("hata", True)
            self.ui.textAktivite.setText("")
            self.ui.groupOffsetler.setEnabled(False)
            self.ui.btnBasla.setEnabled(False)
        self.ui.textAktivite.setStyle(QApplication.style())

    @pyqtSlot()
    def on_btnProfilKonturSec_clicked(self):
        self.setVisible(False)
        try:
            self.__fikatia.durumCubugu = "Lütfen Profile Contouring Seçiniz"
            durum = self.__dokuman.secililer.sec2(["ManufacturingOperation"])
            if durum == "Normal":
                catSecililer = self.__dokuman.secililer
                catNesne = IAktivite.IAktivite(obj=catSecililer.item2(0).nesne.catNesne,
                                               sahip=IProgram(obj=catSecililer.item2(0).nesne.catNesne.parent))
                self.seciliAktivite = catNesne
                if catNesne.parametreler.parametreVarmi("Offset on Contour"):
                # if catNesne.parametreler.parametreVarmi("Offset on part"):
                    self.spinMevcutOffset.setValue(float(catNesne.parametreler["Offset on Contour"].degeri))
                    # self.spinMevcutOffset.setValue(float(catNesne.parametreler["Offset on part"].degeri))
                self.setVisible(True)
            else:
                self.setVisible(True)
                self.__fikatia.durumCubugu = "Profile Contouring Seçimi İptal Edildi"
                self.seciliAktivite = None
        except:
            self.setVisible(True)
            self.seciliAktivite = None

    @pyqtSlot()
    def on_btnIptal_clicked(self):
        global iptal
        iptal = True
        self.ui.stackedWidget.setCurrentIndex(0)

    @pyqtSlot()
    def on_btnAktiviteSil_clicked(self):
        self.seciliAktivite =None

    @pyqtSlot(float)
    def on_spinMevcutOffset_valueChanged(self, value):
        self.mevcutOffset = value

    @pyqtSlot(float)
    def on_spinSonOffset_valueChanged(self, value):
        self.sonOffset = value

    @pyqtSlot(float)
    def on_spinKademeOffset_valueChanged(self, value):
        self.kademeOffset = value

    @pyqtSlot()
    def on_btnBasla_clicked(self):
        @Async()
        def basla(dokuman, offsetler, seciliAktivite, sinyal=self.sinyal):
            global iptal
            __process = IProcessDokuman(obj=dokuman, sahip=IFikatia(obj=dokuman.application))
            __secililer = __process.secililer
            self.sinyal.emit("uyariGoster", { "mesaj": "Hazırlanıyor", "max": len(offsetler), "value": 0 })
            __prgrs = 0
            if not self.ui.checkAyriProgramdaOlustur.isChecked():
                __secililer.temizle()
                __aktivite = seciliAktivite
                for ofst in self.offsetler:
                    __prgrs += 1
                    self.sinyal.emit("uyariGoster",
                                     { "mesaj": "Oluşturuluyor", "value": __prgrs })
                    __secililer.temizle()
                    __secililer.ekle(__aktivite)
                    __secililer.kopyala()
                    __secililer.yapistir()
                    __aktivite = IAktivite.IAktivite(obj=__secililer.item2(0).nesne.catNesne,
                                                     sahip=IProgram(obj=__secililer.item2(0).nesne.catNesne.parent))
                    __aktivite.parametreler["Offset on Contour"].degeri = ofst
                    # __aktivite.parametreler["Offset on part"].degeri = ofst
                    if iptal:
                        iptal = False
                        exit()
            else:
                seciliAktivite = IAktivite.IAktivite(obj=seciliAktivite, sahip=IProgram(obj=seciliAktivite.parent))
                __secililer.temizle()
                __prg = seciliAktivite.sahip
                __aktivite = seciliAktivite
                for ofst in self.offsetler:
                    __prgrs += 1
                    self.sinyal.emit("uyariGoster",
                                     { "mesaj": "Oluşturuluyor", "value": __prgrs })
                    __secililer.temizle()
                    __secililer.ekle(__aktivite)
                    __secililer.kopyala()
                    __process.anaProgram.komut("Manufacturing Program")
                    __secililer.yapistir()
                    __aktivite = IAktivite.IAktivite(obj=__secililer.item2(0).nesne.catNesne,
                                                     sahip=IProgram(obj=__secililer.item2(0).nesne.catNesne.parent))
                    __aktivite.parametreler["Offset on Contour"].degeri = ofst
                    # __aktivite.parametreler["Offset on part"].degeri = ofst
                    if iptal:
                        iptal = False
                        exit()
            iptal = False
            self.sinyal.emit("uyariGoster", { "mesaj": "Tamamlandı" })
            self.sinyal.emit("Tamamlandı",{})
        # --->
        basla(self.__dokuman.asProcessDokuman, self.offsetler, self.seciliAktivite)

    def offsetlerDegisti(self):
        self.offsetler = []
        __gecerliOffset = self.mevcutOffset
        while __gecerliOffset > round(self.sonOffset + self.kademeOffset, 3):
            __gecerliOffset -= self.kademeOffset
            self.offsetler.append(round(__gecerliOffset, 3))
        if len(self.offsetler) > 0:
            if self.offsetler[len(self.offsetler) - 1] != self.sonOffset:
                self.offsetler.append(self.sonOffset)
        if len(self.offsetler) == 0:
            self.offsetler.append(self.sonOffset)
        self.ui.labelOlusacakProgramSayisi.setText(str(len(self.offsetler)) + " Adet Aktivite Oluşturulacak")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("fusion")

    prflPrg = IFikoProfilPrgAlistirma(Catia=win32com.client.Dispatch("Catia.Application"))
    prflPrg.show()

    sys.exit(app.exec())
