# -*- coding: utf-8 -*-
"""

cette librairy contient un empactage de turtle pour simplifier sont utilisation 
dans Spyder le cadre de TD de l'ENSG

@author: Alexis
@date: 02/2026
"""

# import librairy
import turtle as t
import time


# class principale
class TurtleOnSpyder(t.Turtle):
    """
    
    
    Embed de la librairy Turtle pour qu'elle fonctionne proprement dans Spyder,
    
        - gestion specifique car Spyder tourne en PyQt et Turtle en Tkinter (evite les bug)
        - une seule fenetre de possible
    
    
    """
    
    def __init__(self, speed=0):
        """
        

        Args:
            speed (int, optional): vitesse de tracer de Turtle. Defaults to 0.

        Returns:
            None.

        """



        # Réinitialisation si le script est relancé dans Spyder
        if not hasattr(t.TurtleScreen, "_RUNNING") or not t.TurtleScreen._RUNNING:
            t.TurtleScreen._RUNNING = True

        # initialisation Turtle        
        super().__init__()  

        # Réglages de la position initial
        self.ht()
        self.speed(speed) #vitesse
        self.up() #aller a la position de base
        self.goto((-self.screen.window_width() // 2)+10,
                  (self.screen.window_height() // 2)-10)
        self.down()
        
        # Mettre la fenêtre au premier plan
        self.screen.getcanvas().winfo_toplevel().attributes("-topmost", True)

        # Intercepter la fermeture via la croix
        self.screen.getcanvas().winfo_toplevel().protocol("WM_DELETE_WINDOW", self._on_close)

    def close_window(self, auto_close = True):
        """
        

        gestion de la fermeture de la fenêtre
        
        Args:
            auto_close (bool(), optional): 
                - True : fermeture automatique de la fenetre après 5 secondes
                - False : fermeture de la fenetre au clic

        Returns:
            None.

        """


        try:
            if auto_close:
                time.sleep(5)
                self.screen.bye()
            else:
                self.screen.exitonclick()
        except Exception:
            pass
    
    def update_trace(self, val:bool):
        """
        

        controle l'affichage du tracer de la turtle
        
        Args:
            val (bool): 
                - True : mise à jours de l'affichage
                - False : arret de la mise à jours de l'affichage

        Returns:
            None.

        """

        if val :
            t.tracer(1)
        else:
            t.tracer(0)

    # Callback interne pour fermeture
    def _on_close(self):
        try:
            self.screen.bye()
        except Exception:
            pass

# programme test
if __name__ == "__main__":
    
    # initialise la turtle      
    caneva_1 = TurtleOnSpyder(speed=0)
    
    # action d'affichage de la turtle
    
    # ferme la turtle
    caneva_1.close_window(auto_close=False)