import inspect
import os
from random import randint, random, uniform

from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QEvent, QPropertyAnimation, QEasingCurve, QVariant, QTimer, QUrl, \
    QObject
from PyQt6.QtGui import QCursor, QSurfaceFormat, QColor
from PyQt6.QtQuick import QQuickView
from PyQt6.QtWidgets import QListWidgetItem, QMainWindow, QWidget, QSpinBox, QComboBox
from PyQt6.uic import loadUiType
import numpy
from numpy.core.multiarray import ndarray

from IProgram import IProgram
from IYardimciSiniflar import XYZ
import vector3d


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, 'QABAcilarPopup1.ui'))


class QFikatiaTav20AcilarPopup1(QMainWindow, MainWindowUI):
    sinyal = pyqtSignal(str, QVariant)

    def __init__(self, parent=None, Prg:IProgram=None, itm:QListWidgetItem=None):
        super(QFikatiaTav20AcilarPopup1, self).__init__(parent=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_DeleteOnClose)
        self.setWindowFlags(self.windowFlags() & ~Qt.WindowMaximizeButtonHint & ~Qt.WindowMinimizeButtonHint | Qt.WindowStaysOnTopHint)
        self.labelPrgIsmi.setText(self.__prg.ismi)
        # --->
        # QTimer.singleShot(300, self.kacmaDegerleriniAl)

        # self.widgetAciAlani = QWidget
        self.quick = QQuickView(QUrl.fromLocalFile(
            os.path.join(self.__prg.anaProgram.scriptYolu, 'Projeler', 'QMLBilesenleri', '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 __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(QFikatiaTav20AcilarPopup1, 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(500)
        self.anim.setStartValue(0.1)
        self.anim.setEndValue(1)
        self.anim.setEasingCurve(QEasingCurve.InOutCubic)
        self.anim.start()

    @pyqtSlot()
    def fadeOut(self):
        self.setWindowOpacity(1.000)
        self.anim = QPropertyAnimation(self, "windowOpacity")
        self.anim.setDuration(500)
        self.anim.setStartValue(1)
        self.anim.setEndValue(0.001)
        self.anim.setEasingCurve(QEasingCurve.InOutCubic)
        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
        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))
        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))

        self.__vektorleriAl()

    @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))

    @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, "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






