import inspect
import os
import sys

import win32com.client
from PyQt6.QtCore import QTimer
from PyQt6.QtCore import QUrl, pyqtSlot
from PyQt6.QtCore import QVariant, Qt
from PyQt6.QtCore import pyqtSignal
from PyQt6.QtQuick import QQuickView
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

path = os.path.dirname(os.path.abspath(__file__))


# MainWindowUI, MainWindowBase = loadUiType(os.path.join(path, 'formAna.ui'))


class IFikoUniACHead(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(IFikoUniACHead, self).__init__()
        # AÇIKLAMA UI Ayarları
        # self.setupUi(self)
        self.ui = loadUi(path + r'\\formAna.ui', self)
        self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
        self.setWindowFlags(
                self.windowFlags() & ~Qt.WindowType.WindowMaximizeButtonHint & ~Qt.WindowType.WindowMinimizeButtonHint | Qt.WindowType.WindowStaysOnTopHint)
        # AÇIKLAMA Açılış Ayarlamaları
        prgler=self.__fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar
        if len(prgler)>0:
            self.__prg=prgler[0]
            self.labelPrgIsmi.setText(self.__prg.ismi)
            self.__aktiviteleriAl()
        else:
            self.labelPrgIsmi.setText("Lütfen Program Seçip Yenileye Basınız")

        # AÇIKLAMA QML Ayarları
        self.quick = QQuickView(QUrl.fromLocalFile(os.path.join(path, 'ACGauge', 'ACGauge.qml')))
        container = self.createWindowContainer(self.quick)
        container.setMinimumSize(255, 255)
        container.setMaximumSize(255, 255)
       self.quick.setResizeMode(QQuickView.ResizeMode.SizeRootObjectToView)
        self.aciLayout.addWidget(container)
        self.rootObj = self.quick.rootObject()
        # BİLGİ QML Olay Bağlantıları
        self.btnAcilariAl.clicked.connect(self.__acilariAl)
        self.rootObj.offsetMiktariDegisti.connect(self.__offsetMiktariDegisti)
        self.rootObj.acilarDegisti.connect(self.__aciAyarla)

    def show(self):
        super(IFikoUniACHead, self).show()

    def closeEvent(self, *args, **kwargs):
        super(IFikoUniACHead, self).closeEvent(*args, **kwargs)

    @pyqtSlot()
    def on_btnSeciliProgramiAl_clicked(self):
        prgler = self.__fikatia.aktifDokuman.asProcessDokuman.seciliProgramlar
        if len(prgler) > 0:
            self.__prg = prgler[0]
            self.labelPrgIsmi.setText(self.__prg.ismi)
            self.__aktiviteleriAl()
            self.__uyariGoster("Program Aktarıldı")
        else:
            self.__uyariGoster("Seçili Program Yok",hata=True)

    def __uyariGoster(self, uyari: str, hata: bool = False):
        self.labelUyari.setText(uyari)
        if not hata:
            self.labelUyari.setStyleSheet("background:rgba(0,230,0,0.9);color:black;")
        else:
            self.labelUyari.setStyleSheet("background:rgba(240,5,5,0.7);color:white;")
        QTimer.singleShot(5000, lambda: self.labelUyari.setText("FikoYT Dünyasına Hoş Geldiniz..."))
        QTimer.singleShot(5000, lambda: self.labelUyari.setStyleSheet("background:rgba(240,240,5,0.8);color:black;"))

    def __aktiviteleriAl(self):
        self.comboAktivite.clear()
        for x in self.__prg.aktiviteler():
            if x.catNesne.type != "ToolChange":
                self.comboAktivite.addItem(x.ismi, x)

    @pyqtSlot()
    def __acilariAl(self):
        veriler = self.comboAktivite.currentData(Qt.ItemDataRole.UserRole).fikoAcilar
        acAcisi = veriler.AC_Acisi
        ustAci = acAcisi.A
        altAci = acAcisi.C
        self.rootObj.setProperty("takimTuru", self.comboAktivite.currentData(Qt.ItemDataRole.UserRole).takim.toStr2)

        if acAcisi.acilar.dik:
            self.__uyariGoster("Bu Açılar XYZ Eksenlerine Diktir")
        else:
            self.__uyariGoster("Açılar Alındı")

        if acAcisi.islenebilir:
            self.rootObj.setProperty("ustAci", round(float(ustAci), 3))
            self.rootObj.setProperty("altAci", round(float(altAci), 3))
            self.rootObj.setProperty("yonAci", round(float(veriler.saltAcilar.ustAci), 3))

            if not veriler.kacmaDegerleri.takim.hata:
                takim = veriler.kacmaDegerleri.takim.takim
                self.rootObj.setProperty("takimCapi", round(takim.disCapi.degeri, 3))
                self.rootObj.setProperty("takimRadiusu", round(takim.radius.degeri, 3))

                kacmaDegerleri = veriler.kacmaDegerleri.kacmaDegerleri.degerler
                self.rootObj.setProperty("kacmaX", round(kacmaDegerleri.X, 3))
                self.rootObj.setProperty("kacmaY", round(kacmaDegerleri.Y, 3))
                self.rootObj.setProperty("kacmaZ", round(kacmaDegerleri.Z, 3))
            else:
                self.__uyariGoster(veriler.kacmaDegerleri.takim.hataStr, hata=True)
                self.rootObj.setProperty("takimCapi", 0)
                self.rootObj.setProperty("takimRadiusu", 0)
                self.rootObj.setProperty("kacmaX", 0)
                self.rootObj.setProperty("kacmaY", 0)
                self.rootObj.setProperty("kacmaZ", 0)

        else:
            self.__uyariGoster("Bu Kafayla Bu Açı İşlenemez", hata=True)
        self.__vektorleriAl()

        return acAcisi

    @pyqtSlot(float)
    def __offsetMiktariDegisti(self, value: float):
        veriler = self.comboAktivite.currentData(Qt.ItemDataRole.UserRole).fikoAcilar
        acisalOffset = veriler.acisalOffset
        degerler = acisalOffset.degerleriAl(value)

        self.rootObj.setProperty("offsetX", round(degerler.X, 3))
        self.rootObj.setProperty("offsetY", round(degerler.Y, 3))
        self.rootObj.setProperty("offsetZ", round(degerler.Z, 3))

        self.__uyariGoster("Offset Miktarları Alındı")

    @pyqtSlot()
    def __vektorleriAl(self):
        veriler = self.comboAktivite.currentData(Qt.ItemDataRole.UserRole).fikoAcilar
        self.rootObj.setProperty("vektorXI", round(veriler.eksenVektor.X[0], 3))
        self.rootObj.setProperty("vektorXJ", round(veriler.eksenVektor.X[1], 3))
        self.rootObj.setProperty("vektorXK", round(veriler.eksenVektor.X[2], 3))

        self.rootObj.setProperty("vektorYI", round(veriler.eksenVektor.Y[0], 3))
        self.rootObj.setProperty("vektorYJ", round(veriler.eksenVektor.Y[1], 3))
        self.rootObj.setProperty("vektorYK", round(veriler.eksenVektor.Y[2], 3))

        self.rootObj.setProperty("vektorZI", round(veriler.eksenVektor.Z[0], 3))
        self.rootObj.setProperty("vektorZJ", round(veriler.eksenVektor.Z[1], 3))
        self.rootObj.setProperty("vektorZK", round(veriler.eksenVektor.Z[2], 3))

        self.rootObj.setProperty("vektorOX", round(veriler.eksenVektor.O[0], 3))
        self.rootObj.setProperty("vektorOY", round(veriler.eksenVektor.O[1], 3))
        self.rootObj.setProperty("vektorOZ", round(veriler.eksenVektor.O[2], 3))

        self.rootObj.setProperty("takimI", round(veriler.takimYonu.X, 3))
        self.rootObj.setProperty("takimJ", round(veriler.takimYonu.Y, 3))
        self.rootObj.setProperty("takimK", round(veriler.takimYonu.Z, 3))

        self.rootObj.setProperty("sektor", veriler.saltAcilar.sektor)

    @pyqtSlot(float, float)
    def __aciAyarla(self, ust: float, alt: float):
        __dosya = os.path.realpath(os.path.join(self.__prg.anaProgram.scriptYolu, "Prg", "FikoDosya"))
        __aktivite = self.comboAktivite.currentData(Qt.ItemDataRole.UserRole)
        self.__prg.anaProgram.dosyaUyarilariniGoster = False

        dok = self.__prg.anaProgram.dokumanlar.oku(os.path.join(__dosya, "fikoWBKVektor.FikoDll"))
        part = dok.asPartDokuman.part
        eksen = part.eksenler[0]
        poVektor = __aktivite.fikoAcilar.eksenVektor
        parametreler = part.parametreler

        eksen.x = poVektor.X
        eksen.y = poVektor.Y
        eksen.z = poVektor.Z
        eksen.merkez = poVektor.O

        part.guncelle()

        parametreler.item(u"aAcisi").degeri = ust
        parametreler.item(u"cAcisi").degeri = alt

        part.guncelle()
        # --->
        yonUzatma = part.catNesne.HybridBodies.Item("fikoSistemDll")
        yonUzatma = yonUzatma.HybridShapes
        yonUzatma = yonUzatma.Item(3)
        # evalCode = """
        # Dim dirc(2) as Double
        # Uzatma.GetZAxis dirc
        # return = dirc
        # """
        # sonucUzatma = self.__prg.anaProgram.eval(evalCode, "Uzatma", [yonUzatma])
        # --->
        # __aktivite.takimYonu = XYZ(sonucUzatma[0], sonucUzatma[1], sonucUzatma[2])
        __aktivite.takimYonu = part.eksenler[1].z

        # knt = self.__acilariAl()
        # if round(knt.A,3) != ust or round(knt.C,3) != alt:
        #     __aktivite.takimYonu = XYZ(__aktivite.takimYonu.X*-1,__aktivite.takimYonu.Y*-1,__aktivite.takimYonu.Z*-1)
        #     print("tersi")

        dok.kapat()
        self.__prg.anaProgram.dosyaUyarilariniGoster = True

        self.__uyariGoster("Açı Ayarlandı")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("fusion")

    fikoAcHead = IFikoUniACHead(Catia=win32com.client.Dispatch("Catia.Application"))
    fikoAcHead.show()

    sys.exit(app.exec())
