from ctypes import c_void_p, windll
import inspect
import json
import os
import sys
from time import sleep

from PyQt6 import QtGui, QtWidgets
from adodbapi.adodbapi import Dispatch
from numpy import Infinity
import win32com.client
from PyQt6.QtCore import QEvent, QPropertyAnimation, QSettings, QSize, 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 QAbstractItemView, QFrame, QGraphicsOpacityEffect, QInputDialog, QListWidget, QListWidgetItem, QMainWindow, QApplication
from PyQt6.uic import loadUiType, loadUi



import win32gui
import win32con

sys.path.append(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()) + "\\..\\..")))
from IDialoglar.IFikoScript.IFikoCalismaAlani import IFikoCalismaAlani
from IDialoglar.IFikoScript.itemFikoKomut import itemFikoKomut
from IDialoglar.IFikoScript.FikoKomutEkle import FikoKomutEkle
from IDialoglar.IFikoScript.sayfalar.ayarlar.ayarlar import Ayarlar
from IFikatia import IFikatia
from IYardimciSiniflar import XYZ
from IGosterim3d import IGosterim3d

path = os.path.dirname(os.path.abspath(__file__))
# MainWindowUI, MainWindowBase = loadUiType(os.path.join(path, 'formAna.ui'))

is_alanlari=["PrtCfg","CATShapeDesignWorkbench","M3xProgramWorkbench","ManufacturingProgramWorkbench","CATAMGProgramWorkbench"]



class IFikoScript(QMainWindow):
    sinyal = pyqtSignal(str, QVariant)
    ayarlar = QSettings(os.path.join(path,"ayar.FikoAyar"), QSettings.Format.IniFormat)

    def __init__(self, app=QApplication([sys.argv]), Catia=None):
        super(IFikoScript, self).__init__()
        if Catia:
            self.fikatia:IFikatia = IFikatia(obj=Catia)
            if self.fikatia.dokumanlar.sayisi>0:
                self.dokuman = self.fikatia.aktifDokuman
        self.app = app# QApplication([sys.argv])
        self.app.setStyle("fusion")
        self.isAlaniId = self.fikatia.isAlaniId
        print(self.isAlaniId)
        self.fikatia.isAlaniId="Part Design"
        # --->
        # 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ı
        self.ayarlarForm = Ayarlar(app=self.app,parent=self)
        # QTimer oluştur ve timeout sinyaline bağla
        self.statusBar().messageChanged.connect(self.check_status_bar)
        # Opacity effect oluştur
        self.opacity_effect = QGraphicsOpacityEffect(self.statusBar())
        self.statusBar().setGraphicsEffect(self.opacity_effect)

        # Fade İn animasyonu oluştur
        self.fadein_animation = QPropertyAnimation(self.opacity_effect, b"opacity")
        self.fadein_animation.setDuration(1000)  # 1 saniyede tamamlansın
        self.fadein_animation.setStartValue(0.0)  # Tam görünür
        self.fadein_animation.setEndValue(1.0)    # Tamamen kaybolmuş
        # Fade Out animasyonu oluştur
        self.fadeOut_animation = QPropertyAnimation(self.opacity_effect, b"opacity")
        self.fadeOut_animation.setDuration(1000)  # 1 saniyede tamamlansın
        self.fadeOut_animation.setStartValue(1.0)  # Tam görünür
        self.fadeOut_animation.setEndValue(0.0)    # Tamamen kaybolmuş

        # self.setLocale(QLocale(QLocale.Language.Turkish, QLocale.Country.Turkey))
        self.setWindowIcon(QtGui.QIcon(os.path.join(path, "Resimler", "akt.png")))
        self.listeAlanlar()
        # AÇIKLAMA Logo Animasyon
        lbl = self.ui.labelLogo
        movie = QtGui.QMovie(os.path.join(path, "Resimler", "hiper.gif"))
        lbl.setMovie(movie)
        lbl.show()
        movie.start()

        # BİLGİ: QT Olay Bağlantıları
        self.actionKapat.triggered.connect(self.kapat)
        self.butonAnaKapat.clicked.connect(self.kapat)
        # self.btnYeniKomutEkle.clicked.connect(self.tiklandiKomutEkle)
        self.btnYenile.clicked.connect(self.komutlariEkle)
        self.btnAyarlar.clicked.connect(self.tiklandiAyarlar)

        #--->
        self.listeKomut.setSelectionMode(QAbstractItemView.SelectionMode.NoSelection)

        self.listeKomut.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)

        self.listeKomut.setFrameShape(QFrame.Shape.NoFrame)

        self.komutlariEkle()

        self.listeKomut.itemDoubleClicked.connect(self.item_cift_tiklandi)

        self.editArama.textChanged.connect(self.komut_ara)
        
        self.shell = win32com.client.Dispatch("WScript.Shell")
        self.aktif_et()

    def kapat(self,*args, **kwargs):
        QtWidgets.QApplication.instance().quit()
        self.app.exit()
        sys.exit()

    def show(self):
        geometry = self.ayarlar.value("geometry")

        # Pencere hareket ettirildiğinde ekran sınırlarını kontrol et
        screen = QtGui.QGuiApplication.primaryScreen()
        screen_geometry = screen.availableGeometry()

        current_geometry = geometry if geometry else self.geometry()
        if not screen_geometry.contains(current_geometry):
            # Eğer pencere ekranın dışına çıkarsa, ekranın içine taşı
            new_geometry = current_geometry
            if current_geometry.topLeft().x() < screen_geometry.topLeft().x():
                new_geometry.moveLeft(screen_geometry.topLeft().x())
            if current_geometry.topLeft().y() < screen_geometry.topLeft().y():
                new_geometry.moveTop(screen_geometry.topLeft().y())
            if current_geometry.bottomRight().x() > screen_geometry.bottomRight().x():
                new_geometry.moveRight(screen_geometry.bottomRight().x())
            if current_geometry.bottomRight().y() > screen_geometry.bottomRight().y():
                new_geometry.moveBottom(screen_geometry.bottomRight().y())

            geometry= new_geometry

        if geometry is not None:
            self.setGeometry(geometry)

        self.editArama.setText(self.ayarlar.value("aramaKutusu",""))
        super(IFikoScript, self).show()
        # QTimer.singleShot(2000,self.aktif_et)

    def aktif_et(self):
        # hwnd = self.winId()
        # win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
        # win32gui.SetForegroundWindow(hwnd)
        self.shell.SendKeys('%')
        self.shell.SendKeys('{TAB}')
        self.shell.AppActivate(self.windowTitle())
        self.setWindowState(self.windowState() & ~Qt.WindowState.WindowMinimized | Qt.WindowState.WindowActive)
        self.activateWindow()
        

    def closeEvent(self, *args, **kwargs):
        self.ayarlar.setValue("geometry", self.geometry())
        self.ayarlar.setValue("aramaKutusu", self.editArama.text())
        super(IFikoScript, self).closeEvent(*args, **kwargs)
        # sys.exit()

    def check_status_bar(self):
         # Fade animasyonunu durdur ve başlangıç değerini ayarla
        self.fadein_animation.stop()
        self.opacity_effect.setOpacity(0.0)
        # Status bar mesajını kontrol et ve gerekirse varsayılan mesajı göster
        if self.statusBar().currentMessage() == '':
            self.statusBar().showMessage("FikoYT'un Erişilemez Sınırsız Dünyası")
            self.opacity_effect.setOpacity(1.0)
        if self.statusBar().currentMessage()=="FikoYT'un Erişilemez Sınırsız Dünyası":
            pass
        else:
            self.fadein_animation.start()

    def komut_ara(self,text1=None):
        if text1 is None:
            text1=self.editArama.text()
            # text1 = QInputDialog.getText(self, "Arama Filitresi",
            #                               "Kelime:")[0]
        if text1 == "":
            for x in range(self.listeKomut.count()):
                self.listeKomut.item(x).setHidden(False)
        else:
            for x in range(self.listeKomut.count()):
                if (text1.lower()) in str(self.listeKomut.item(x).ui.ismi).lower():
                    self.listeKomut.item(x).setHidden(False)
                else:
                    self.listeKomut.item(x).setHidden(True)


    def tiklandiAyarlar(self):
        self.ayarlarForm.show()
        


    def listeAlanlar(self):
        directory_path=os.path.join(path, "Alanlar")
        self.comboBoxAlanlar.clear()
        # Klasörleri listeleme
        folders = sorted([f for f in os.listdir(directory_path) if os.path.isdir(os.path.join(directory_path, f))],)# key=lambda x: os.path.getmtime(os.path.join(directory_path, x)), reverse=True)

        for folder in folders:
            folder_path = os.path.join(directory_path, folder)
            icon_path = os.path.join(folder_path, 'simge.png')
            json_path = os.path.join(folder_path, 'veri.json')

            # JSON dosyasını okuma
            # data = None
            # if os.path.isfile(json_path):
            #     try:
            #         with open(json_path, 'r') as json_file:
            #             data = json.load(json_file)
            #     except Exception as json_error:
            #         print(f"JSON dosyası okunamadı: {json_error}")
            # print(folder_path)
            if os.path.isfile(icon_path):
                icon = QtGui.QIcon(icon_path)
                self.comboBoxAlanlar.addItem(icon,folder)
                index = self.comboBoxAlanlar.count()
                self.comboBoxAlanlar.setItemData(index-1, IFikoCalismaAlani(alan=folder_path,ana_program=self))
            else:
                self.comboBoxAlanlar.addItem(folder_path)
                index = self.comboBoxAlanlar.count()
                self.comboBoxAlanlar.setItemData(index-1, IFikoCalismaAlani(alan=folder_path,ana_program=self))
        # QComboBox'a klasörleri ekleme
        # self.comboBoxAlanlar.addItems(folders)

    def komutlariEkle(self):
        # item = QListWidgetItem()
        # widgetitem = itemFikoKomut(parent=self)
        # item.setSizeHint(QSize(45, 45))
        # item.ui = widgetitem

        # self.listeKomut.addItem(item)
        # self.listeKomut.setItemWidget(item, widgetitem)
        self.listeKomut.clear()
        if self.comboBoxAlanlar.currentData()!=None:
            if self.comboBoxAlanlar.currentData().komut_listesi!=None:
                self.comboBoxAlanlar.currentData().komutListesiniAl()
                komutlar = self.comboBoxAlanlar.currentData().komut_listesi
            else:
                komutlar=[]
        else:
            komutlar=[]
        
        # print(komutlar)
        for komut in komutlar:
            item = QListWidgetItem()
            widgetitem = komut
            item.setSizeHint(widgetitem.sizeHint())
            item.ui = widgetitem

            self.listeKomut.addItem(item)
            self.listeKomut.setItemWidget(item, widgetitem)
        
        self.komut_ara()
        # pass

    def item_cift_tiklandi(self,item, *args,**kwargs):
        if self.ayarlarForm.check_cift_tikla_calistir.isChecked():
            item.ui.calistir()
        pass

    def tiklandiKomutEkle(self):
        self.dialogKomutEkle=FikoKomutEkle(parent=self,ana_program=self)
        self.dialogKomutEkle.exec()

import pythoncom
import win32com.client
from win32com.client import DispatchWithEvents,getevents

class CATIAEvents:
    def OnDocumentOpen(self, doc):
        print(f"Document opened: {doc.Name}")

def main():
    # CATIA uygulamasına bağlan
    catia:IFikatia = IFikatia(win32com.client.Dispatch("CATIA.Application"))

    # print(catia.pencereler[0].gosterimler[0].catNesne.__dir__())
    # print(catia.pencereler[0].gosterimler[0].catNesne.CLSID)
    # print(getevents(catia.catNesne.CLSID))
    gosterim=catia.pencereler[0].gosterimler[0].asType("Vivewer3d",IGosterim3d)
    # gosterim.gosterimNoktasi3d.UstYon([0,1,1])
    catia.interaktif=True
    sleep(5)
    while True:
        
        gosterim.dondur(gosterim.gosterimNoktasi3d.GormeYonu().to_array(),1, True)
        # gosterim.guncelle()
        # view.rotate(5, 10, 5)
        sleep(0.05)
    catia.interaktif=True
if __name__ == "__main__":
    main()

if __name__ == '__main__1':
    app = QApplication(sys.argv)
    app.setStyle("fusion")
    cta=Dispatch("Catia.Application")
    cta.Visible=True
    IFikoscr = IFikoScript(app=app,Catia=cta)
    IFikoscr.show()

    sys.exit(app.exec())


#"C:\Program Files\Dassault Systemes\B20\win_b64\code\bin\CATBatchStarter.exe" -input D:\__sistem__\Masaustu\qq.xml