from PyQt5.QtWidgets import QDialog, QMessageBox, QDialogButtonBox, QProgressDialog, QApplication
from PyQt5.uic import loadUi
from qgis.core import QgsProject
from PyQt5.QtCore import Qt, QTimer  # Ajout de l'importation de QtCore
from PyQt5 import uic
from PyQt5.QtWidgets import *
import os
import time  # Utilisé pour simuler un traitement long
import urllib.request

# Dossier cache local
ui_cache_dir = os.path.join(os.path.expanduser("~"), "qgis_ui_cache")
os.makedirs(ui_cache_dir, exist_ok=True)

# URL de base
base_url = "https://symbols.sde03.fr/qgis/ui/"

ui_file = "action-mode-integration-noeud.ui"

ui_path = os.path.join(ui_cache_dir, ui_file)

# Télécharger si nécessaire
if not os.path.exists(ui_path):
    urllib.request.urlretrieve(base_url + ui_file, ui_path)

# Charger le UI
# uic.loadUi(local_ui_path, self)



# Définissez le chemin du fichier .ui
# ui_path = r"P:/Informatique/Cartographie/Projets QGis/Forms/action-mode-integration-noeud.ui"

def execution(iface, formulaire):
    try:
        # Couche active
        layer_noeuds = iface.activeLayer()

        # Récupérer les entités sélectionnées
        selected_features = layer_noeuds.selectedFeatures()

        if len(selected_features) == 0 :
            QMessageBox.warning(None, "Avertissement", "Aucun élément sélectionné !")
            return

        # Créer la fenêtre de progression
        progress = QProgressDialog("Traitement en cours...", "Annuler", 0, 100, iface.mainWindow())
        progress.setWindowModality(Qt.WindowModal)  # Utiliser Qt.WindowModal
        progress.setCancelButton(None)  # Désactiver le bouton annuler si nécessaire
        progress.setRange(0, 100)
        progress.setValue(0)
        progress.setLabelText("Mise à jour en cours...")
        progress.show()

        # Récupération du mode d'intégration choisi en vérifiant les boutons radio
        if formulaire.mode_integration_pose.isChecked():
            selected_mode = "Pose"
        elif formulaire.mode_integration_depose.isChecked():
            selected_mode = "Dépose"
        elif formulaire.mode_integration_remplacement.isChecked():
            selected_mode = "Remplacement"
        elif formulaire.mode_integration_modification.isChecked():
            selected_mode = "Modification"
        elif formulaire.mode_integration_initialisation.isChecked():
            selected_mode = "Initialisation"
        elif formulaire.mode_integration_exclu.isChecked():
            selected_mode = "Exclu"     
        else:
            selected_mode = None  # Aucun bouton sélectionné

        if selected_mode is None:
            QMessageBox.warning(None, "Avertissement", "Aucun mode sélectionné !")
            return

        # Démarrer l'édition de la couche
        if not layer_noeuds.isEditable():
            layer_noeuds.startEditing()

        # Calcul de l'incrément pour la barre de progression
        increment = int(100 / len(selected_features))

        # Boucle pour traiter toutes les entités
        for feature in selected_features:
            #On fait évoluer la barre de progression
            progress.setValue(progress.value() + increment)
            QApplication.processEvents()  # Permet de garder l'interface réactive

            # Modifier
            feature.setAttribute('mode_integration', selected_mode)

            # On vide les données de nouveau pour les Modes dépose et exclu
            if selected_mode in ['Exclu','Dépose'] : 
                existingData = feature['data'] or {} 
                existingData['nouveau'] = {}
                feature.setAttribute('data', existingData)


            #Validation de la modification
            layer_noeuds.updateFeature(feature)

        # Valider les modifications
        # layer_noeuds.commitChanges()

        # Désactiver la sélection
        # layer_noeuds.removeSelection()

        # Fermer la fenêtre d'attente une fois le traitement terminé
        progress.setValue(100)
        progress.hide()

        # Afficher un message de confirmation
        QMessageBox.information(None, "Succès", "Le traitement est terminé avec succès !")

        # Fermer le formulaire
        formulaire.close()
        
    except Exception as e:
        QMessageBox.critical(None, "Erreur", f"Une erreur est survenue : {e}")


def formulaire(iface):
    try:
        # Créer une instance de QDialog
        dialog = QDialog()
        
        # Charger le fichier .ui dans le QDialog
        loadUi(ui_path, dialog)

        # Récupérer le QDialogButtonBox
        button_box = dialog.findChild(QDialogButtonBox, "buttonBox")

        if button_box:
            # Connecter le bouton OK
            button_box.accepted.connect(lambda: execution(iface, dialog))

            # Connecter le bouton Annuler (si présent)
            button_box.rejected.connect(dialog.reject)
        
        # Afficher le formulaire
        dialog.exec_()
    except Exception as e:
        # Gérer les erreurs
        QMessageBox.critical(None, "Erreur", f"Impossible d'ouvrir le formulaire : {e}")
