import tkinter as tk
from tkinter import messagebox
import os
import webbrowser
import sys

import threading


def lire_incrementer_compteur():
    # Chemin correct du fichier compteur dans le dossier Base de données
    dossier_bd = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Base de données")
    if not os.path.exists(dossier_bd):
        os.makedirs(dossier_bd)

    fichier_compteur = os.path.join(dossier_bd, "compteur.txt")
    lock = threading.Lock()

    with lock:
        # Crée le fichier s'il n'existe pas
        if not os.path.exists(fichier_compteur):
            with open(fichier_compteur, "w") as f:
                f.write("0")

        # Lire le compteur actuel
        with open(fichier_compteur, "r") as f:
            try:
                compteur = int(f.read().strip())
            except ValueError:
                compteur = 0

        # Incrémenter
        compteur += 1

        # Réécrire le compteur
        with open(fichier_compteur, "w") as f:
            f.write(str(compteur))

    return compteur

def resource_path(relative_path):
    """Permet de retrouver les fichiers dans le dossier 'Base de données' quand on compile en exe"""
    try:
        base_path = sys._MEIPASS  # chemin temporaire PyInstaller
    except Exception:
        base_path = os.path.abspath(".")
    
    # On cherche tous les fichiers dans le sous-dossier 'Base de données'
    base_path = os.path.join(base_path, "Base de données")
    return os.path.join(base_path, relative_path)

# Conduites à tenir
conduites = {
    "Hémorragie": "1. Repérer l'origine du saignement.\n2. Comprimer immédiatement la zone qui saigne.\n3. Maintenir la compression.\n4. Allonger la victime.\n5. Faire alerter ou alerter soi-même (15).",
    "Étouffement": "➡️ Obstruction complète :\n1. 1 à 5 claques dans le dos.\n2. Si inefficace : 1 à 5 compressions abdominales.\n➡️ Obstruction partielle : ne rien faire, surveiller.\n Faire alerter ou alerter soi-même (15).",
    "Malaise / Douleur thoracique": "1. Signes : paralysie d'un bras, visage déformé, difficulté à parler/voir, douleur poitrine.\n2. Sans gêne respiratoire : allonger confortablement.\n3. Avec gêne respiratoire : installer assis.\n4. Si autre position adoptée spontanément : respecter.\n5 Faire alerter ou alerter soi-même (15).",
    "Brûlure": "1. Refroidir sous eau courante 10-20 minutes.\n2. Retirer vêtements/bijoux (⚠️ sauf s'ils adhèrent).\n3. Évaluer la gravité. \n4 Faire alerter ou alerter soi-même (15).",
    "Inconsciente mais respire (PLS)": "1. Mettre la victime sur le côté (PLS).\n2. Alerter immédiatement les secours (15).\n3. Si seul : mettre en PLS puis alerter.\n4. Surveiller respiration en attendant secours.",
    "Inconsciente et ne respire pas (RCP + DAE)": "1. Alerter secours (15) et demander un DAE.\n2. Débuter immédiatement la RCP : 30 compressions thoraciques + 2 insufflations si formé.\n3. Mettre en place le DAE dès son arrivée et suivre ses instructions.\n4. Ne jamais arrêter avant arrivée des secours ou reprise d'une respiration normale."
}

# Texte Départ Taxi Site : 
texte_taxi = """Depart Taxi 

- Validation 

- Contacter 
  taxi

- Fournir les informations suivantes :
  Départ > Adresse d'arrivée
  Nom Prénom / Numéro de téléphone

- Fournir ensuite la décharge."""

class Questionnaire:
    def __init__(self, root, logo_image):
        self.root = root
        self.root.title("Guide interactif du SST")
        self.root.geometry("1200x900")
        self.root.configure(bg="#f0f0f0")
        self.historique = []
        self.logo_image = logo_image
        self.frame_question = tk.Frame(root, bg="#f0f0f0")
        self.frame_question.pack(fill="both", expand=True)
        self.afficher_question1()

    def clear_frame(self):
        for widget in self.frame_question.winfo_children():
            widget.destroy()

    def afficher_logo_bas(self):
        self.logo_label = tk.Label(self.frame_question, image=self.logo_image, bg="#f0f0f0")
        self.logo_label.image = self.logo_image
        self.logo_label.pack(side="bottom", pady=20)

    def afficher_cat(self, titre):
        texte = conduites.get(titre, "Conduite à tenir non définie.")
        cat_window = tk.Toplevel()
        cat_window.title(f"Conduite à tenir - {titre}")
        cat_window.geometry("600x400")
        tk.Label(cat_window, text=f"Conduite à tenir - {titre}", font=("Arial", 14, "bold")).pack(pady=10)
        tk.Label(cat_window, text=texte, justify="left", wraplength=550, font=("Arial", 12)).pack(padx=15, pady=10)
        tk.Button(cat_window, text="Fermer", command=cat_window.destroy, bg="red", fg="white", font=("Arial", 12, "bold")).pack(pady=10)

    # Question 1
    def afficher_question1(self):
        self.clear_frame()
        if not self.historique:
            self.historique.append(None)
        else:
            self.historique.append(self.afficher_question1)

        tk.Label(self.frame_question, text="S'agit-il d'une urgence vitale ?", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=20)
        situations = ["Hémorragie", "Étouffement", "Malaise / Douleur thoracique", "Brûlure", "Inconsciente mais respire (PLS)", "Inconsciente et ne respire pas (RCP + DAE)"]
        for s in situations:
            tk.Label(self.frame_question, text=f"- {s}", font=("Arial", 14), bg="#f0f0f0", anchor="w").pack(anchor="w", padx=40)

        frame_btn = tk.Frame(self.frame_question, bg="#f0f0f0")
        frame_btn.pack(pady=10)
        tk.Button(frame_btn, text="Oui", font=("Arial", 14), bg="#0078D7", fg="white", command=self.afficher_page_situations).pack(side="left", padx=20)
        tk.Button(frame_btn, text="Non", font=("Arial", 14), bg="#28a745", fg="white", command=self.afficher_non_urgence).pack(side="left", padx=20)
        tk.Button(frame_btn, text="Peut-être", font=("Arial", 14), bg="#ffc107", fg="black", command=self.afficher_peut_etre).pack(side="left", padx=20)

        tk.Label(self.frame_question, text="⚠️ Si la situation n'est pas clairement une urgence vitale (hémorragie importante, étouffement, inconscient, brûlure grave…), il n'est pas nécessaire de contacter immédiatement le 15.", font=("Arial", 12, "italic"), fg="gray", wraplength=700, justify="left", bg="#f0f0f0").pack(pady=15)
        self.afficher_logo_bas()


    def afficher_peut_etre(self):
        self.clear_frame()
        self.historique.append(self.afficher_question1)
        tk.Label(self.frame_question, text="Précautions si la situation peut se dégrader", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=20)
        
        # Nouveau texte avec ajout adresse et consignes
        texte = ("Vous êtes sur le site \n\n"
                 "Indiquer l'endroit exact de votre appel.\n\n"
                 "Si vous êtes face à une prise en charge SST et que la situation n'était pas vitale"
                 " mais qu'elle se dégrade visiblement, contactez le 15.\n\n"
                 "L'appel au 15 permet :\n\n"
                 "1 - Un avis médical auprès d'un médecin régulateur.\n\n"
                 "⚠️ Lors de l'appel,votre bilan SST doit être calme et factuel.\n\n"
                 "✅Votre message doit comporter la possibilité d'orienter les AA..\n\n"
                 "2 - Selon l'avis du médecin régulateur, envoi d'un véhicule de secours ou non.\n\n"
                 "Si non : orienter vers un départ accompagné ou en taxi.\n\n"
                 "3 - Si oui : un bilan médical avec compte rendu au médecin régulateur sera effectué sur site.\n\n"
                 "4 - Décision du médecin régulateur : transport vers le CH par les secours ou refus de transport.\n\n"
                 "5 - En cas de refus de transport par le médecin régulateur, orienter l'AA vers un départ accompagné ou en taxi.\n\n"
                 "Si le médecin oriente vers une consultation, veuillez appuyer sur le bouton Lieux de consultations ci-dessous :\n\n"
                 "⚠️ Chaque appel injustifié d'une ambulance mobilise des moyens d'urgence qui pourraient manquer ailleurs.")
        
        tk.Label(self.frame_question, text=texte, font=("Arial", 12), wraplength=700, justify="left", bg="#f0f0f0").pack(pady=20, padx=20)
        
        # Bouton "Lieux de consultations"
        tk.Button(self.frame_question, text="Lieux de consultations", 
                 font=("Arial", 12, "bold"), bg="#17a2b8", fg="white", 
                 command=self.ouvrir_affichage_sst).pack(pady=10)
        
        tk.Button(self.frame_question, text="Orientation départ avec un proche ou taxi", font=("Arial", 14), bg="#28a745", fg="white", command=self.afficher_question_poste_adapte).pack(pady=15)
        tk.Button(self.frame_question, text="Retour", font=("Arial", 12, "bold"), bg="gray", fg="white", command=self.retour).pack(pady=10)
        self.afficher_logo_bas()

    # Page situations urgences
    def afficher_page_situations(self):
        self.clear_frame()
        self.historique.append(self.afficher_question1)
        tk.Label(self.frame_question, text="Sélectionnez la situation d'urgence :", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=20)
        situations = ["Hémorragie", "Étouffement", "Malaise / Douleur thoracique", "Brûlure", "Inconsciente mais respire (PLS)", "Inconsciente et ne respire pas (RCP + DAE)"]
        for titre in situations:
            tk.Button(self.frame_question, text=titre, font=("Arial", 14, "bold"), bg="#0078D7", fg="white", relief="raised", padx=10, pady=5, command=lambda t=titre: self.afficher_cat(t)).pack(fill="x", padx=50, pady=5)
        tk.Button(self.frame_question, text="INRS SST", font=("Arial", 14), bg="#28a745", fg="white", command=self.ouvrir_pdf).pack(pady=20)
        tk.Button(self.frame_question, text="Retour", font=("Arial", 12, "bold"), bg="gray", fg="white", command=self.retour).pack(pady=10)
        self.afficher_logo_bas()

    def ouvrir_pdf(self):
        chemin_pdf = resource_path("GDTSST.pdf")
        if os.path.exists(chemin_pdf):
            webbrowser.open_new(chemin_pdf)
        else:
            tk.messagebox.showerror("Erreur", "Le fichier GDTSST.pdf est introuvable dans le dossier courant.")

    # Question non urgence
    def afficher_non_urgence(self):
        self.clear_frame()
        self.historique.append(self.afficher_question1)
        tk.Label(self.frame_question, text="Y a-t-il besoin d'un soin ?", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=20)
        
        tk.Label(self.frame_question, text="Pas de besoin de soin si :", font=("Arial", 14, "bold"), bg="#f0f0f0").pack(pady=10, anchor="w", padx=40)
        tk.Label(self.frame_question, text="- Difficulté passagère (maux de tête, gastro, maux de dents, règles douloureuses...)", 
                 font=("Arial", 12), bg="#f0f0f0", justify="left", wraplength=650).pack(anchor="w", padx=60)
        tk.Label(self.frame_question, text="- Difficultés morales", font=("Arial", 12), bg="#f0f0f0").pack(anchor="w", padx=60)

        # Nouveau texte avant les boutons
        tk.Label(self.frame_question, text="Si besoin d’un soin, merci de le tracer.", 
                 font=("Arial", 14, "bold"), bg="#f0f0f0").pack(pady=10, anchor="w", padx=40)
        
        # Frame principale pour tous les boutons
        frame_btn = tk.Frame(self.frame_question, bg="#f0f0f0")
        frame_btn.pack(pady=20)
        
        # Boutons Oui / Non
        tk.Button(frame_btn, text="Oui", font=("Arial", 14), bg="#0078D7", fg="white", command=self.question_infirmier).pack(side="left", padx=20)
        tk.Button(frame_btn, text="Non", font=("Arial", 14), bg="#28a745", fg="white", command=self.afficher_question_travail).pack(side="left", padx=20)
        
        # Bouton Faire le formulaire de soin
        tk.Button(frame_btn, text="Faire le formulaire de soin", 
                  font=("Arial", 12, "bold"), bg="#6f42c1", fg="white", command=self.ouvrir_formulaire_soin).pack(side="left", padx=20)
        
        # Bouton Retour séparé
        tk.Button(self.frame_question, text="Retour", font=("Arial", 12, "bold"), bg="gray", fg="white", command=self.retour).pack(pady=20)
        
        self.afficher_logo_bas()

    # Question infirmier
    def question_infirmier(self):
        self.clear_frame()
        self.historique.append(self.afficher_non_urgence)
        tk.Label(self.frame_question, text="Avez-vous un infirmier disponible ?", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=20)
        frame_btn = tk.Frame(self.frame_question, bg="#f0f0f0")
        frame_btn.pack(pady=10)
        tk.Button(frame_btn, text="Oui", font=("Arial", 14), bg="#0078D7", fg="white", command=self.page_infirmier).pack(side="left", padx=20)
        tk.Button(frame_btn, text="Non", font=("Arial", 14), bg="#28a745", fg="white", command=self.afficher_question_travail).pack(side="left", padx=20)
        tk.Button(self.frame_question, text="Retour", font=("Arial", 12, "bold"), bg="gray", fg="white", command=self.retour).pack(pady=20)
        self.afficher_logo_bas()

    # Appel infirmier
    def page_infirmier(self):
        self.clear_frame()
        self.historique.append(self.question_infirmier)
        tk.Label(self.frame_question, text="Appel infirmier", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=50)
        tk.Button(self.frame_question, text="Retour", font=("Arial", 12, "bold"), bg="gray", fg="white", command=self.retour).pack(pady=20)
        self.afficher_logo_bas()

    # Question travail
    def afficher_question_travail(self):
        self.clear_frame()
        self.historique.append(self.afficher_non_urgence)
        tk.Label(self.frame_question, text="Est-ce lié au travail ?", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=20)
        
        frame_btn = tk.Frame(self.frame_question, bg="#f0f0f0")
        frame_btn.pack(pady=20)
        tk.Button(frame_btn, text="Oui", font=("Arial", 14), bg="#0078D7", fg="white", command=self.page_safety).pack(side="left", padx=20)
        tk.Button(frame_btn, text="Non", font=("Arial", 14), bg="#28a745", fg="white", command=self.afficher_question_poste_adapte).pack(side="left", padx=20)
        
        tk.Button(self.frame_question, text="Retour", font=("Arial", 12, "bold"), bg="gray", fg="white", command=self.retour).pack(pady=20)
        self.afficher_logo_bas()

    # Méthodes pour ouvrir fichiers (PDF / Excel / Image)
    def ouvrir_affichage_sst(self):
        chemin_image = resource_path("affichage SST.png")
        if os.path.exists(chemin_image):
            webbrowser.open_new(chemin_image)
        else:
            extensions = [".png", ".jpg", ".jpeg", ".gif", ".bmp"]
            for ext in extensions:
                chemin_test = resource_path(f"affichage SST{ext}")
                if os.path.exists(chemin_test):
                    webbrowser.open_new(chemin_test)
                    return
            tk.messagebox.showerror("Erreur", "Le fichier 'affichage SST' est introuvable.")

    def ouvrir_formulaire_soin(self):
        chemin_excel = resource_path("formulaire.xlsm")
        if os.path.exists(chemin_excel):
            webbrowser.open_new(chemin_excel)
        else:
            extensions = [".xlsm", ".xlsx", ".xls"]
            for ext in extensions:
                chemin_test = resource_path(f"formulaire de soin{ext}")
                if os.path.exists(chemin_test):
                    webbrowser.open_new(chemin_test)
                    return
            tk.messagebox.showerror("Erreur", "Le fichier 'formulaire de soin' est introuvable.")

    def ouvrir_recueil_donnee(self):
        chemin_excel = resource_path("Recueil.xlsm")
        if os.path.exists(chemin_excel):
            webbrowser.open_new(chemin_excel)
        else:
            extensions = [".xlsm", ".xlsx", ".xls"]
            for ext in extensions:
                chemin_test = resource_path(f"Recueil de donnee{ext}")
                if os.path.exists(chemin_test):
                    webbrowser.open_new(chemin_test)
                    return
            tk.messagebox.showerror("Erreur", "Le fichier 'Recueil' est introuvable.")

    # Poste adapté
    def afficher_question_poste_adapte(self):
        self.clear_frame()
        self.historique.append(self.afficher_question_travail)
        tk.Label(self.frame_question, text="Peut-il rester sur son poste ou sur un poste aménagé ?", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=20)
        frame_btn = tk.Frame(self.frame_question, bg="#f0f0f0")
        frame_btn.pack(pady=10)
        tk.Button(frame_btn, text="Oui", font=("Arial", 14), bg="#0078D7", fg="white", command=self.page_poste_adapte).pack(side="left", padx=20)
        tk.Button(frame_btn, text="Non", font=("Arial", 14), bg="#28a745", fg="white", command=self.afficher_question_accompagnement).pack(side="left", padx=20)
        tk.Button(self.frame_question, text="Retour", font=("Arial", 12, "bold"), bg="gray", fg="white", command=self.retour).pack(pady=20)
        self.afficher_logo_bas()

    # Question accompagnement
    def afficher_question_accompagnement(self):
        self.clear_frame()
        self.historique.append(self.afficher_question_poste_adapte)
        tk.Label(self.frame_question, text="peut-il prévenir quelqu'un pour venir le chercher ?", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=20)
        frame_btn = tk.Frame(self.frame_question, bg="#f0f0f0")
        frame_btn.pack(pady=10)
        tk.Button(frame_btn, text="Oui", font=("Arial", 14), bg="#0078D7", fg="white", command=self.page_depart_accompagne).pack(side="left", padx=20)
        tk.Button(frame_btn, text="Non", font=("Arial", 14), bg="#28a745", fg="white", command=self.page_deroule_taxi).pack(side="left", padx=20)
        tk.Button(self.frame_question, text="Retour", font=("Arial", 12, "bold"), bg="gray", fg="white", command=self.retour).pack(pady=20)
        self.afficher_logo_bas()

    # Pages finales
    def page_poste_adapte(self):
        self.clear_frame()
        tk.Label(self.frame_question, text="Retour au poste ou poste adapté", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=50)
        tk.Button(self.frame_question, text="Retour", font=("Arial", 12, "bold"), bg="gray", fg="white", command=self.retour).pack(pady=20)
        self.afficher_logo_bas()

    def page_depart_accompagne(self):
        self.clear_frame()
        tk.Label(self.frame_question, text="Départ accompagné", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=50)
        tk.Button(self.frame_question, text="Retour", font=("Arial", 12, "bold"), bg="gray", fg="white", command=self.retour).pack(pady=20)
        self.afficher_logo_bas()

    def page_deroule_taxi(self):
        self.clear_frame()
        tk.Label(self.frame_question, text="Déroulé du process taxi", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=20)
        tk.Label(self.frame_question, text=texte_taxi, font=("Arial", 12), wraplength=700, justify="left", bg="#f0f0f0").pack(pady=20)
        tk.Button(self.frame_question, text="Retour", font=("Arial", 12, "bold"), bg="gray", fg="white", command=self.retour).pack(pady=20)
        self.afficher_logo_bas()

    # Page Safety sans bouton recueil
    def page_safety(self):
        self.clear_frame()
        tk.Label(self.frame_question, text="Évaluation du devenir", font=("Arial", 16, "bold"), bg="#f0f0f0").pack(pady=30)
        tk.Label(self.frame_question, text="Après l'analyse, merci de cliquer sur 'Suivant' pour évaluer le devenir de l'AA.", 
        font=("Arial", 12), wraplength=800, justify="center", bg="#f0f0f0", fg="blue").pack(pady=20)
        tk.Button(self.frame_question, text="Suivant", font=("Arial", 14, "bold"), bg="#28a745", fg="white", 
        command=self.afficher_question_poste_adapte).pack(pady=20)
        tk.Button(self.frame_question, text="Retour", font=("Arial", 12, "bold"), bg="gray", fg="white", command=self.retour).pack(pady=20)
        self.afficher_logo_bas()

    # Retour
    def retour(self):
        if self.historique:
            func = self.historique.pop()
            if func:
                func()

# Page d'accueil
def page_accueil():
    accueil = tk.Tk()
    accueil.title("Guide du SST")
    accueil.geometry("750x500")
    accueil.configure(bg="#f0f0f0")

    # Récupérer et incrémenter le compteur
    compteur = lire_incrementer_compteur()

    logo_image = tk.PhotoImage(file=resource_path("WHS.png"))
    tk.Label(accueil, image=logo_image, bg="#f0f0f0").pack(pady=20)
    tk.Label(accueil, text="Guide interactif du SST - LIL1", font=("Arial", 24, "bold"), bg="#f0f0f0").pack(pady=20)

    # Afficher le compteur d'ouvertures
    tk.Label(accueil, text=f"Nombre d'ouvertures : {compteur}", font=("Arial", 14), bg="#f0f0f0").pack(pady=10)

    tk.Button(accueil, text="Commencer", font=("Arial", 16, "bold"), bg="#0078D7", fg="white",
              command=lambda: demarrer(accueil, logo_image)).pack(pady=50)

    accueil.mainloop()

def demarrer(root, logo_image):
    root.destroy()
    root2 = tk.Tk()
    Questionnaire(root2, logo_image)
    root2.mainloop()

if __name__ == "__main__":
    page_accueil()

