import inspect
import os

from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QTimer, QEvent, QPropertyAnimation, QEasingCurve, QSize, QVariant
from PyQt6.QtGui import QIcon, QPixmap, QCursor
from PyQt6.QtWidgets import QWidget, QListWidgetItem, QLineEdit, QMainWindow
from PyQt6.uic import loadUiType
import re
from IProcessDokuman import IProcessDokuman

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, 'QFikatiaProgramKameraPopup1.ui'))


class QFikatiaProgramKameraPopup1(QMainWindow, MainWindowUI):
    sinyal = pyqtSignal(str, QVariant)

    def __init__(self, parent=None, Prg:IProgram=None, itm:QListWidgetItem=None):
        super(QFikatiaProgramKameraPopup1, 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
        self.__kameralar = self.__prg.kameralar

        rsmEkle = QPixmap(os.path.join(self.resimYolu, "eklentiler.png"))
        rsmCop = QPixmap(os.path.join(self.resimYolu, "cop.png"))
        self.rsmKamera = QPixmap(os.path.join(self.resimYolu, "kamera.png"))

        self.btnKameraEkle.setIcon(QIcon(rsmEkle))
        self.btnKameraSil.setIcon(QIcon(rsmCop))
        self.btnFotogtafCek.setIcon(QIcon(self.rsmKamera))

        if hasattr(self.parent(), 'sinyal'):
            self.sinyal = self.parent().sinyal

        self.move(QCursor.pos())

        self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, False)
        from ctypes import windll, c_int, byref

        windll.dwmapi.DwmExtendFrameIntoClientArea(c_int(self.winId().__int__()), byref(c_int(-1)))
        self.setWindowFlags(Qt.WindowType.CustomizeWindowHint | Qt.WindowType.Drawer | Qt.WindowType.WindowStaysOnTopHint)

        self.kameraListesiniAl()
        self.listKameralar.itemDoubleClicked.connect(lambda itm:self.__kameraGoster(itm))
        self.editKamera.setHidden(True)



    def show(self):
        super(QFikatiaProgramKameraPopup1, self).show()
        # self.fadeIn()
        self.sinyal.emit("kameraPencereAcildi",self)

    def mousePressEvent(self, event):
        self.offset = event.pos()

    def mouseMoveEvent(self, event):
        x = event.globalX()
        y = event.globalY()
        x_w = self.offset.x()
        y_w = self.offset.y()
        self.move(x - x_w, y - y_w)

    @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:
                # self.fadeOut()
                pass
            finally:
                QTimer.singleShot(600, self.__beklemeliKapat)
            return
        QMainWindow.changeEvent(self, e)

    @pyqtSlot()
    def __kameraGoster(self, itm):
        itm.Kamera.goster()
        self.sinyal.emit("kameraGösterildi",[self.__prg,itm.Kamera])

    @pyqtSlot()
    def __beklemeliKapat(self):
        if not self.isActiveWindow():
            self.sinyal.emit("kameraPencereKapatildi",self)
            self.close()
            self.listKameralar.clear()
            del self

    @pyqtSlot()
    def kameraListesiniAl(self):
        self.sinyal.emit("kameraListesiniAl",True)
        for x in range(len(self.__kameralar)):
            icon = QIcon()
            icon.addPixmap(self.rsmKamera,
                           QIcon.Mode.Normal, QIcon.State.Off)
            arry = eval(self.__kameralar[x].ismi)
            itm = QListWidgetItem(icon,arry[1])
            itm.Kamera=self.__kameralar[x]
            itm.setSizeHint(QSize(24, 24))
            self.listKameralar.addItem(itm)
        self.sinyal.emit("kameraListesiniAl",False)

    @pyqtSlot()
    def on_btnKameraEkle_clicked(self):
        kmr = self.__prg.kameraEkle()
        # --->
        icon = QIcon()
        icon.addPixmap(self.rsmKamera,
                                   QIcon.Mode.Normal, QIcon.State.Off)
        arry = eval(kmr.ismi)
        itm = QListWidgetItem(icon,arry[1])
        itm.Kamera = kmr
        itm.setSizeHint(QSize(24, 24))
        self.listKameralar.addItem(itm)

        self.sinyal.emit("kameraEklendi",[self.__prg,kmr])

    @pyqtSlot()
    def on_btnKameraSil_clicked(self):
        ProcessDokuman = IProcessDokuman(self.__prg.catNesne.Parent)
        items = self.listKameralar.selectedItems()
        if len(items) > 0:
            self.sinyal.emit("kameraSilindi",[self.__prg,self.listKameralar.currentItem().Kamera])

            ProcessDokuman.kameralar.sil(self.listKameralar.currentItem().Kamera.ismi)
            self.listKameralar.takeItem(self.listKameralar.row(self.listKameralar.currentItem()))
        else:
            self.sinyal.emit("kameraSilinemedi","Seçili Kamera Yok")

    @pyqtSlot()
    def on_btnFotogtafCek_clicked(self):
        try:
            prg = eval(self.listKameralar.currentItem().Kamera.ismi)[1]
            no=eval(self.listKameralar.currentItem().Kamera.ismi)[2]
            dosya = os.path.join(IProcessDokuman(self.__prg.catNesne.Parent).klasoru,prg+"("+no+").jpg")
            self.listKameralar.currentItem().Kamera.resimDosyaya(dosya)
        except:
            pass