import inspect
import os
import sys

import win32com.client
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 IDialoglar.IFikoKutuk.threadManager import Async
from IDokuman import IDokuman
from IEksen import IEksen
from IPart import IPart
from IYardimciSiniflar import XYZ

class IFikoDialogKutuk(QMainWindow):
    sinyal = pyqtSignal(str, QVariant)

    def __init__(self, parent=None, flags=0, Catia=None, app= QApplication([sys.argv])):
        self.__fikatia = IFikatia(obj=Catia)
        self.__dokuman = self.__fikatia.aktifDokuman
        self.app = app

        super(IFikoDialogKutuk, 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)

        self.ui.boxParametreler.setEnabled(False)
        self.ui.btnOlustur.setEnabled(False)

        # AÇIKLAMA Logo Animasyon
        lbl = self.ui.labelResimKutuk
        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()

        self.__aktifItem = None
        self.__aktifEksen = None
        self.__ciktiItem = None
        self.__ilkOlculer = None
        self.sinyal.connect(self.sinyalGeldi)

    @property
    def aktifItem(self):
        return self.__aktifItem

    @aktifItem.setter
    def aktifItem(self, value):
        self.__aktifItem = value
        if value and self.aktifEksen:
            self.ui.btnOlustur.setEnabled(True)
        else:
            self.ui.btnOlustur.setEnabled(False)

    @aktifItem.deleter
    def aktifItem(self):
        self.__aktifItem = None

    @property
    def aktifEksen(self) -> IEksen:
        return self.__aktifEksen

    @aktifEksen.setter
    def aktifEksen(self, value: IEksen):
        if value:
            self.__aktifEksen = IEksen(obj=value.catNesne)
        else:
            self.__aktifEksen = None
        if value and self.aktifItem:
            self.ui.btnOlustur.setEnabled(True)
        else:
            self.ui.btnOlustur.setEnabled(False)

    @aktifEksen.deleter
    def aktifEksen(self):
        self.__aktifEksen = None

    @property
    def ciktiItem(self):
        return self.__ciktiItem

    @ciktiItem.setter
    def ciktiItem(self, value):
        self.__ciktiItem = value
        if value:
            self.ui.boxParametreler.setEnabled(True)
            # self.ui.btnOlustur.setVisible(False)

    @ciktiItem.deleter
    def ciktiItem(self):
        self.__ciktiItem = None

    @property
    def ilkOlculer(self) -> XYZ:
        return self.__ilkOlculer

    @ilkOlculer.setter
    def ilkOlculer(self, value: XYZ):
        self.__ilkOlculer = value
        if value:
            self.ui.spinOlcuX.setValue(value.X)
            self.ui.spinOlcuY.setValue(value.Y)
            self.ui.spinOlcuZ.setValue(value.Z)

    @ilkOlculer.deleter
    def ilkOlculer(self):
        self.__ilkOlculer = None

    def sinyalGeldi(self, sinyal, argumanlar=None):
        if sinyal == "ok":
            self.ui.stackedWidget.setCurrentIndex(2)

    def show(self):
        super(IFikoDialogKutuk, self).show()

    def closeEvent(self, *args, **kwargs):
        super(IFikoDialogKutuk, self).closeEvent(*args, **kwargs)

    @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ı")

    @pyqtSlot()
    def on_btnBodySec_clicked(self):
        self.setVisible(False)
        # --->
        secililer = self.__dokuman.secililer
        self.__fikatia.aktifEt()
        durum = secililer.sec2(["HybridBody", "Body"], Mesaj="Lütfen Body Seçiniz")
        if durum == "Normal":
            self.aktifItem = secililer.item2(0).nesne
            self.textBody.setText(self.aktifItem.ismi)
            self.setVisible(True)
        else:
            self.__fikatia.durumCubugu = "Seçim İptal Edildi"
            self.setVisible(True)
        # --->
        self.setVisible(True)

        print("Body Seç Tıklandı")

    @pyqtSlot()
    def on_btnBodySil_clicked(self):
        self.textBody.setText("")
        self.aktifItem = None
        # --->
        print("Body Temizle Tıklandı")

    @pyqtSlot()
    def on_btnEksenSec_clicked(self):
        self.setVisible(False)
        # --->
        secililer = self.__dokuman.secililer
        self.__fikatia.aktifEt()
        durum = secililer.sec2(["AxisSystem"], Mesaj="Lütfen Eksen Seçiniz")
        if durum == "Normal":
            self.aktifEksen = secililer.item2(0).nesne
            self.textEksen.setText(self.aktifEksen.ismi)
            self.setVisible(True)
        else:
            self.__fikatia.durumCubugu = "Seçim İptal Edildi"
            self.setVisible(True)
        # --->
        self.setVisible(True)

        print("Eksen Seç Tıklandı")

    @pyqtSlot()
    def on_btnEksenSil_clicked(self):
        self.textEksen.setText("")
        self.aktifEksen = None
        # --->
        print("Eksen Temizle Tıklandı")

    @pyqtSlot()
    def on_btnOlustur_clicked(self):
        # AÇIKLAMA Ayrı Body Seçilmiş İse
        if self.__dokuman.turu.upper() == ".CATPART":
            part = self.__dokuman.asPartDokuman.part
        elif self.__dokuman.turu.upper() == ".CATPRODUCT":
            part = self.__dokuman.asProductDokuman.product.dokuman.asPartDokuman.part
        elif self.__dokuman.turu.upper() == ".CATPROCESS":
            part = self.__dokuman.asProcessDokuman.partOperasyonlari[0].urunDokumani.dokuman.asPartDokuman.part
        else:
            self.__dokuman.secililer.ara(".Part;all")
            part = IPart(obj=self.__dokuman.secililer.item2(0).nesne.catNesne,
                         sahip=self.__dokuman.anaProgram.catNesne)
        bodyer = part.catNesne.Bodies

        fikoBody = bodyer.add()
        fikoBody.name = "FikoKutuk"
        # AÇIKLAMA FikoNesneler Oluşturuyor
        data = self.aktifItem
        self.catiaElementEkle(data.catNesne)
        # -->
        print("Buton Oluştur Tıklandı")

    def catiaElementEkle(self, catNesne):
        scriptDosya = os.path.join(self.ScriptYolu, "FikoKutuk.FikoDll")

        yonler = self.aktifEksen

        if self.__dokuman.turu.upper() == ".CATPART":
            part = self.__dokuman.asPartDokuman.part
        elif self.__dokuman.turu.upper() == ".CATPRODUCT":
            part = self.__dokuman.asProductDokuman.product.dokuman.asPartDokuman.part
        elif self.__dokuman.turu.upper() == ".CATPROCESS":
            part = self.__dokuman.asProcessDokuman.partOperasyonlari[0].urunDokumani.dokuman.asPartDokuman.part
        else:
            self.__dokuman.secililer.ara(".Part;all")
            part = IPart(obj=self.__dokuman.secililer.item2(0).nesne.catNesne,
                         sahip=self.__dokuman.anaProgram.catNesne)

        factory = part.catNesne.GetCustomerFactory("InstanceFactory")

        factory.BeginInstanceFactory("FikoKutuk", scriptDosya)

        factory.BeginInstantiate()
        factory.PutInputData("parca", catNesne)

        Instance = factory.Instantiate()

        factory.EndInstantiate()
        factory.EndInstanceFactory()

        Instance.GetParameter("O.X").value = yonler.merkez.X
        Instance.GetParameter("O.Y").value = yonler.merkez.Y
        Instance.GetParameter("O.Z").value = yonler.merkez.Z

        Instance.GetParameter("X.X").value = yonler.x.X
        Instance.GetParameter("X.Y").value = yonler.x.Y
        Instance.GetParameter("X.Z").value = yonler.x.Z

        Instance.GetParameter("Y.X").value = yonler.y.X
        Instance.GetParameter("Y.Y").value = yonler.y.Y
        Instance.GetParameter("Y.Z").value = yonler.y.Z

        Instance.GetParameter("Z.X").value = yonler.z.X
        Instance.GetParameter("Z.Y").value = yonler.z.Y
        Instance.GetParameter("Z.Z").value = yonler.z.Z

        part.guncelle()

        param1 = Instance

        XOlcu = param1.GetParameter("XOlcu").value
        YOlcu = param1.GetParameter("YOlcu").value
        ZOlcu = param1.GetParameter("ZOlcu").value

        self.ilkOlculer = XYZ(XOlcu,YOlcu,ZOlcu)
        # self.ui.labelOlculer.setText(str(XOlcu)+","+str(YOlcu)+","+str(ZOlcu))

        self.ciktiItem = param1

        return param1

    @pyqtSlot()
    def on_btnCikis_clicked(self):
        self.close()
        # --->
        print("Çıkış Tıklandı")

    @pyqtSlot()
    def on_btnOffsetUygula_clicked(self):
        if self.__dokuman.turu.upper() == ".CATPART":
            part = self.__dokuman.asPartDokuman.part
        elif self.__dokuman.turu.upper() == ".CATPRODUCT":
            part = self.__dokuman.asProductDokuman.product.dokuman.asPartDokuman.part
        elif self.__dokuman.turu.upper() == ".CATPROCESS":
            part = self.__dokuman.asProcessDokuman.partOperasyonlari[0].urunDokumani.dokuman.asPartDokuman.part
        else:
            self.__dokuman.secililer.ara(".Part;all")
            part = IPart(obj=self.__dokuman.secililer.item2(0).nesne.catNesne,
                         sahip=self.__dokuman.anaProgram.catNesne)
        #--->
        eksiX = self.ui.spinEksiX.value()
        artiX = self.ui.spinArtiX.value()
        eksiY = self.ui.spinEksiY.value()
        artiY = self.ui.spinArtiY.value()
        eksiZ = self.ui.spinEksiZ.value()
        artiZ = self.ui.spinArtiZ.value()
        #--->
        self.ciktiItem.GetParameter("X+Offset").value = artiX
        self.ciktiItem.GetParameter("X-Offset").value = eksiX

        self.ciktiItem.GetParameter("Y+Offset").value = artiY
        self.ciktiItem.GetParameter("Y-Offset").value = eksiY

        self.ciktiItem.GetParameter("Z+Offset").value = artiZ
        self.ciktiItem.GetParameter("Z-Offset").value = eksiZ
        #--->
        part.guncelle()
        #--->
        self.olcuGuncelle()

    @pyqtSlot()
    def olcuGuncelle(self):
        XOlcu = self.ciktiItem.GetParameter("XOlcu").value
        YOlcu = self.ciktiItem.GetParameter("YOlcu").value
        ZOlcu = self.ciktiItem.GetParameter("ZOlcu").value
        #--->
        self.ui.spinOlcuX.setValue(XOlcu)
        self.ui.spinOlcuY.setValue(YOlcu)
        self.ui.spinOlcuZ.setValue(ZOlcu)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("fusion")

    ktk = IFikoDialogKutuk(Catia=win32com.client.Dispatch("Catia.Application"))
    ktk.show()

    sys.exit(app.exec())
