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 loadUiType, loadUi

sys.path.append(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()) + "\\..\\..")))

from IFikatia import IFikatia
from IYardimciSiniflar import XYZ

path = os.path.dirname(os.path.abspath(__file__))
# MainWindowUI, MainWindowBase = loadUiType(os.path.join(path, 'formAna.ui'))


class IFikoTav20(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(IFikoTav20, 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, 'TavGauge', 'TavGauge.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.btnYenile.clicked.connect(self.__acilariAl)
        self.rootObj.offsetMiktariDegisti.connect(self.__offsetMiktariDegisti)
        self.rootObj.acilarDegisti.connect(self.__aciAyarla)

    def show(self):
        super(IFikoTav20, self).show()

    def closeEvent(self, *args, **kwargs):
        super(IFikoTav20, 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, self.__uyariSifirla)
        QTimer.singleShot(5000, self.__uyariSifirla)
    
    def __uyariSifirla(self):
        self.labelUyari.setText("FikoYT Dünyasına Hoş Geldiniz...") if self.isVisible() else None
        self.labelUyari.setStyleSheet("background:rgba(240,240,5,0.8);color:black;") if self.isVisible() else None

    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):
        if not self.comboAktivite.currentData(Qt.ItemDataRole.UserRole):
            self.__uyariGoster("Aktivite Belirtilmemiş",True)
            return
        veriler = self.comboAktivite.currentData(Qt.ItemDataRole.UserRole).fikoAcilar
        ustAci = veriler.saltAcilar.ustAci
        altAci = veriler.saltAcilar.altAci
        self.rootObj.setProperty("ustAci", round(float(ustAci), 3))
        self.rootObj.setProperty("altAci", round(float(altAci), 3))
        self.rootObj.setProperty("yonAci", round(float(ustAci), 3))
        takim = veriler.kacmaDegerleri.takim.takim
        self.rootObj.setProperty("takimCapi", round(takim.disCapi.degeri, 3))
        print("Bursa")
        try:
            self.rootObj.setProperty("takimRadiusu", round(takim.radius.degeri, 3))
        except:
            self.rootObj.setProperty("takimRadiusu", round(0.0))
        print("burda", takim.disCapi.degeri)
        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))

        self.__vektorleriAl()

        if altAci==0.0:
            self.__uyariGoster("Bu Aktivite Diktir",hata=True)
        else:
            self.__uyariGoster("Açılar Alındı")

    @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):
        print(ust, alt)
        __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, "fikoSaltVektor.FikoDll"))
        part = dok.asPartDokuman.part
        eksen = part.eksenler[0]
        poVektor = __aktivite.fikoAcilar.eksenVektor
        parametreler = part.parametreler
        if ust >= 180:
            ust = 180 + ust
        elif ust < 180:
            ust = ust + 180

        alt = 180 - alt

        eksen.x = poVektor.X
        eksen.y = poVektor.Y
        eksen.z = poVektor.Z
        eksen.merkez = poVektor.O

        part.guncelle()

        parametreler.item(u"ustAci").degeri = ust
        parametreler.item(u"altAci").degeri = alt
       
        part.guncelle()
        # --->
        yonUzatma = part.catNesne.HybridBodies.Item("fikoSistemDll")
        yonUzatma = yonUzatma.HybridShapes
        yonUzatma = yonUzatma.Item(5)
        
        evalCode = """
            dim sonuc(2) as Double
            sonuc(0) = Uzatma.Direction.GetXVal()
            sonuc(1) = Uzatma.Direction.GetYVal()
            sonuc(2) = Uzatma.Direction.GetZVal()
            return = sonuc
        """
        sonucUzatma = self.__prg.anaProgram.eval(evalCode, "Uzatma", [yonUzatma])
        # --->
        __aktivite.takimYonu = XYZ(sonucUzatma[0], sonucUzatma[1], sonucUzatma[2])

        dok.kapat()
        self.__prg.anaProgram.dosyaUyarilariniGoster = True
        # print("__aciAyarla","Burda", __aktivite, XYZ(sonucUzatma[0], sonucUzatma[1], sonucUzatma[2]))
        self.__uyariGoster("Açı Ayarlandı")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("fusion")

    IFikoTav = IFikoTav20(Catia=win32com.client.Dispatch("Catia.Application"))
    IFikoTav.show()

    sys.exit(app.exec())
