import inspect
import os

from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QEvent, QPropertyAnimation, QEasingCurve, QVariant, QUrl
from PyQt6.QtGui import QCursor
from PyQt6.QtQuick import QQuickView
from PyQt6.QtWidgets import QListWidgetItem, QMainWindow
from PyQt6.uic import loadUiType

from IProgram import IProgram

path = os.path.dirname(os.path.abspath(__file__))
resimYolu = os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))),
                         "Resimler")

MainWindowUI, MainWindowBase = loadUiType(os.path.join(path, 'QACAcilarPopup1.ui'))


class QACAcilarPopup1(QMainWindow, MainWindowUI):
    sinyal = pyqtSignal(str, QVariant)

    def __init__(self, parent=None, Prg: IProgram = None, itm: QListWidgetItem = None):
        super(QACAcilarPopup1, self).__init__(parent)
        self.setupUi(self)
        self.resimYolu = os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))),
                                      "Resimler")

        self.__prg = Prg
        self.__itm = itm

        if hasattr(self.parent(), 'sinyal'):
            self.sinyal = self.parent().sinyal

        self.move(QCursor.pos())

        # self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, False)
        self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)

        self.setWindowFlags(
            self.windowFlags() & ~Qt.WindowType.WindowMaximizeButtonHint & ~Qt.WindowType.WindowMinimizeButtonHint | Qt.WindowType.WindowStaysOnTopHint)

        self.labelPrgIsmi.setText(self.__prg.ismi)

        # --->
        # QTimer.singleShot(300, self.kacmaDegerleriniAl)

        # self.widgetAciAlani = QWidget
        self.quick = QQuickView(QUrl.fromLocalFile(os.path.join(path, 'ACGauge01', 'FiGauge360deg1.qml')))
        # self.quick.setOpacity(0.999)
        # self.quick.setColor( Qt.transparent )

        container = self.createWindowContainer(self.quick)
        container.setMinimumSize(255, 255)
        container.setMaximumSize(255, 255)

        self.quick.setResizeMode(QQuickView.ResizeMode.SizeRootObjectToView)

        # self.quick.show()
        self.aciLayout.addWidget(container)

        self.rootObj = self.quick.rootObject()

        self.btnYenile.clicked.connect(self.__acilariAl)

        self.rootObj.offsetMiktariDegisti.connect(self.__offsetMiktariDegisti)
        self.rootObj.acilarDegisti.connect(self.__aciAyarla)
        self.__aktiviteleriAl()


    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;")
            # 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;"))
        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):
        for x in self.__prg.aktiviteler():
            # self.comboAktivite.addItem(x.ismi)
            # item = QListWidgetItem()
            # item.setData(0, x)
            # item.aktivite = x
            # item.setText(x.ismi)
            if x.catNesne.type != "ToolChange":
                self.comboAktivite.addItem(x.ismi, x)

    def show(self):
        super(QACAcilarPopup1, self).show()
        # self.fadeIn()
        # self.sinyal.emit("acilarPencereAcildi", self)

    @pyqtSlot()
    def fadeIn(self):
        self.setWindowOpacity(0.1)
        self.anim = QPropertyAnimation(self, "windowOpacity")
        self.anim.setDuration(1000)
        self.anim.setStartValue(0.1)
        self.anim.setEndValue(1)
        self.anim.setEasingCurve(QEasingCurve.Linear)
        self.anim.start()

    @pyqtSlot()
    def fadeOut(self):
        self.setWindowOpacity(1.000)
        self.anim = QPropertyAnimation(self, "windowOpacity")
        self.anim.setDuration(1000)
        self.anim.setStartValue(1)
        self.anim.setEndValue(0.001)
        self.anim.setEasingCurve(QEasingCurve.Linear)
        self.anim.start()

    def changeEvent(self, e):
        if (e.type() == QEvent.Type.ActivationChange and not self.isActiveWindow()):
            try:
                pass
                # self.fadeOut()
            finally:
                pass
                # QTimer.singleShot(600, self.__beklemeliKapat)
            return
        QMainWindow.changeEvent(self, e)

    @pyqtSlot()
    def __beklemeliKapat(self):
        if not self.isActiveWindow():
            self.sinyal.emit("acilarPencereKapatildi", self)
            self.close()
            del self

    @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)
        print(yonUzatma.Name)
        # 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ı")


