from ctypes import c_void_p, windll
import inspect
import json
import os
import sys

from PyQt5.QtGui import QKeySequence
from PyQt6 import QtGui, QtWidgets
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, QFileDialog, QFrame, QGraphicsOpacityEffect, QInputDialog, QListWidget, QListWidgetItem, QMainWindow, QApplication, QMessageBox, QTableWidgetItem
from PyQt6.uic import loadUiType, loadUi




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 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 Ayarlar(QMainWindow):
    sinyal = pyqtSignal(str, QVariant)
    ayarlar = QSettings(os.path.join(path,"ayar.FikoKureselAyarlar"), QSettings.Format.IniFormat)

    def __init__(self, app=None, parent=None):
        self.app = app# QApplication([sys.argv])
        # --->
        super(Ayarlar, self).__init__(parent=parent)
        # AÇIKLAMA UI Ayarları
        # self.setupUi(self)
        self.ui = loadUi(path + r'\\ayarlar.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.btn_kapat.clicked.connect(lambda:self.close())
        self.actionKapat.triggered.connect(lambda:self.close())
        # self.setLocale(QLocale(QLocale.Language.Turkish, QLocale.Country.Turkey))
        self.setWindowIcon(QtGui.QIcon(os.path.join(path, "Resimler", "gear.webp")))
        # AÇIKLAMA Logo Animasyon

        # BİLGİ: QT Olay Bağlantıları
        self.check_komut_sonrasi_kapat.setCheckState(self.ayarlar.value("check_komut_sonrasi_kapat", defaultValue=Qt.CheckState.Unchecked))
        self.check_komut_sonrasi_kapat.stateChanged.connect(self.degisti_check_komut_sonrasi_kapat)
        self.check_cift_tikla_calistir.setCheckState(self.ayarlar.value("check_cift_tikla_calistir", defaultValue=Qt.CheckState.Unchecked))
        self.check_cift_tikla_calistir.stateChanged.connect(self.degisti_check_cift_tikla_calistir)

    def degisti_check_komut_sonrasi_kapat(self, durum):
        self.ayarlar.setValue("check_komut_sonrasi_kapat",  self.check_komut_sonrasi_kapat.checkState())

    def degisti_check_cift_tikla_calistir(self, durum):
        self.ayarlar.setValue("check_cift_tikla_calistir",  self.check_cift_tikla_calistir.checkState())

    def show(self):
        self.ortam_klasor_listesi_oku()
        self.uzak_adres_listesi_oku()
        self.ortam_degiskenleri_oku()

        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)
        super(Ayarlar, self).show()

    def closeEvent(self,event, *args, **kwargs):
        event.ignore()
        self.hide()
        self.ayarlar.setValue("geometry", self.geometry())
        self.ortam_klasor_listesi_kaydet()
        self.uzak_adres_listesi_kaydet()
        self.ortam_degiskenleri_kaydet()
        # super(Ayarlar, self).closeEvent(*args, **kwargs)

    @pyqtSlot()
    def on_btn_ortam_klasoru_ekle_clicked(self):
        folder = QFileDialog.getExistingDirectory(self, 'Ortam Klasörü Seç')
        if folder:
            existing_items = self.liste_ortam_klasorleri.findItems(folder, Qt.MatchFlag.MatchExactly)
            if not existing_items:
                self.liste_ortam_klasorleri.addItem(folder)
            else:
                QMessageBox.warning(self, 'Zaten Mevcut', 'Seçtiğiniz klasör zaten listede mevcut.')


    @pyqtSlot()
    def on_btn_ortam_klasoru_sil_clicked(self):
        selected_items = self.liste_ortam_klasorleri.selectedItems()

        if not selected_items:
            return
        
        # Ask for confirmation before removing
        reply = QMessageBox.question(self, 'Eminmisiniz?', 'Seçili Öğeler Silinecek Bu Eklentilerinizin Kararsız İşlem Yapmasına Neden Olabilir.Silmek İstiyormusunuz?',
                                     QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
        if reply == QMessageBox.StandardButton.Yes:
            for item in selected_items if selected_items else []:
                self.liste_ortam_klasorleri.takeItem(self.liste_ortam_klasorleri.row(item))


    def ortam_klasor_listesi_kaydet(self):
        self.ayarlar.beginWriteArray('ortam_klasorleri')
        for i in range(self.liste_ortam_klasorleri.count()):
            self.ayarlar.setArrayIndex(i)
            self.ayarlar.setValue('ortam_klasorleri', self.liste_ortam_klasorleri.item(i).text())
        self.ayarlar.endArray()

    def ortam_klasor_listesi_oku(self):
        self.liste_ortam_klasorleri.clear()
        size = self.ayarlar.beginReadArray('ortam_klasorleri')
        for i in range(size):
            self.ayarlar.setArrayIndex(i)
            folder_path = self.ayarlar.value('ortam_klasorleri')
            self.liste_ortam_klasorleri.addItem(folder_path)
        self.ayarlar.endArray()

    @pyqtSlot()
    def on_btn_uzak_adres_ekle_clicked(self):
        folder, ok = QInputDialog.getText(self, 'Uzak Adres', 'Uzak Sunucunun Adresini Giriniz')
        if ok:
            if folder:
                existing_items = self.liste_uzak_ortam_adresleri.findItems(folder, Qt.MatchFlag.MatchExactly)
                if not existing_items:
                    self.liste_uzak_ortam_adresleri.addItem(folder)
                else:
                    QMessageBox.warning(self, 'Zaten Mevcut', 'Seçtiğiniz Adres zaten listede mevcut.')


    @pyqtSlot()
    def on_btn_uzak_adres_sil_clicked(self):
        selected_items = self.liste_uzak_ortam_adresleri.selectedItems()

        if not selected_items:
            return
        
        # Ask for confirmation before removing
        reply = QMessageBox.question(self, 'Eminmisiniz?', 'Seçili Öğeler Silinecek Bu Eklentilerinizin Kararsız İşlem Yapmasına Neden Olabilir.Silmek İstiyormusunuz?',
                                     QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
        if reply == QMessageBox.StandardButton.Yes:
            for item in selected_items if selected_items else []:
                self.liste_uzak_ortam_adresleri.takeItem(self.liste_uzak_ortam_adresleri.row(item))


    def uzak_adres_listesi_kaydet(self):
        self.ayarlar.beginWriteArray('uzak_adres')
        for i in range(self.liste_uzak_ortam_adresleri.count()):
            self.ayarlar.setArrayIndex(i)
            self.ayarlar.setValue('uzak_adres', self.liste_uzak_ortam_adresleri.item(i).text())
        self.ayarlar.endArray()

    def uzak_adres_listesi_oku(self):
        self.liste_uzak_ortam_adresleri.clear()
        size = self.ayarlar.beginReadArray('uzak_adres')
        for i in range(size):
            self.ayarlar.setArrayIndex(i)
            folder_path = self.ayarlar.value('uzak_adres')
            self.liste_uzak_ortam_adresleri.addItem(folder_path)
        self.ayarlar.endArray()

    @pyqtSlot()
    def on_btn_ortam_degisken_ekle_clicked(self):
        rowPosition = self.table_ortam_degiskenleri.rowCount()
        self.table_ortam_degiskenleri.insertRow(rowPosition)

        item1 = QTableWidgetItem("")
        item2 = QTableWidgetItem("")

        self.table_ortam_degiskenleri.setItem(rowPosition, 0, item1)
        self.table_ortam_degiskenleri.setItem(rowPosition, 1, item2)
        

    @pyqtSlot()
    def on_btn_ortam_degisken_sil_clicked(self):
        selectedRows = set()
        for item in self.table_ortam_degiskenleri.selectedItems():
            selectedRows.add(item.row())

        if selectedRows:
            reply = QMessageBox.question(self, "Onay", "Seçili satırları silmek istiyor musunuz?", QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
            if reply == QMessageBox.StandardButton.Yes:
                for row in sorted(selectedRows, reverse=True):
                    self.table_ortam_degiskenleri.removeRow(row)

    def ortam_degiskenleri_oku(self):
            self.table_ortam_degiskenleri.clear()
            self.table_ortam_degiskenleri.setHorizontalHeaderLabels(['İsim', 'Değer'])
            settings = self.ayarlar

            # Kaydedilmiş verileri yükle
            rowCount = settings.value("tablo_ortam_degiskenleri_rowCount", 0, type=int)
            columnCount = settings.value("tablo_ortam_degiskenleri_columnCount", 2, type=int)  # Default olarak 2 sütun

            self.table_ortam_degiskenleri.setRowCount(rowCount)
            self.table_ortam_degiskenleri.setColumnCount(columnCount)

            for row in range(rowCount):
                for col in range(columnCount):
                    itemText = settings.value(f"tablo_ortam_degiskenleri_item_{row}_{col}", "", type=str)
                    item = QTableWidgetItem(itemText)
                    self.table_ortam_degiskenleri.setItem(row, col, item)

    def ortam_degiskenleri_kaydet(self):
        settings = self.ayarlar

        # Satır ve sütun sayısını kaydet
        settings.setValue("tablo_ortam_degiskenleri_rowCount", self.table_ortam_degiskenleri.rowCount())
        settings.setValue("tablo_ortam_degiskenleri_columnCount", self.table_ortam_degiskenleri.columnCount())

        # Her hücreyi kaydet
        for row in range(self.table_ortam_degiskenleri.rowCount()):
            for col in range(self.table_ortam_degiskenleri.columnCount()):
                item = self.table_ortam_degiskenleri.item(row, col)
                if item:
                    settings.setValue(f"tablo_ortam_degiskenleri_item_{row}_{col}", item.text())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("fusion")

    IFikoscr = Ayarlar(app=app,Catia=win32com.client.Dispatch("Catia.Application"))
    IFikoscr.show()

    sys.exit(app.exec())
