import random
import string

class Robot:
    orientations_possibles = ["NORD", "EST", "SUD", "OUEST"]
    statuts_possibles = {1: "EN SERVICE", 2: "HORS SERVICE", 3: "EN REPARATION"}
    nb_robots_crees = 0

    def __init__(self, robot_type="Générique", orientation="NORD", statut=1):
        self._robot_type = "Générique"
        self.robot_type = robot_type  # Utilise le setter
        self._numero_serie = self._generer_numero_serie()
        self._orientation = orientation if orientation in Robot.orientations_possibles else "NORD"
        self._statut = statut if statut in Robot.statuts_possibles else 1
        Robot.nb_robots_crees += 1

    # --- Robot type ---
    @property
    def robot_type(self):
        return self._robot_type

    @robot_type.setter
    def robot_type(self, value):
        if isinstance(value, str) and len(value) >= 2:
            self._robot_type = value
        else:
            print("Erreur : robot_type doit contenir au moins 2 caractères. Valeur par défaut utilisée.")
            self._robot_type = "Générique"

    # --- Numero de série ---
    @property
    def numero_serie(self):
        return self._numero_serie

    def _generer_numero_serie(self):
        lettres = ''.join(random.choices(string.ascii_uppercase, k=2))
        chiffres = str(random.randint(0, 999999999)).zfill(10)
        return lettres + chiffres

    # --- Orientation ---
    @property
    def orientation(self):
        return self._orientation

    # --- Statut ---
    @property
    def statut(self):
        return self._statut

    @statut.setter
    def statut(self, value):
        if value in Robot.statuts_possibles:
            self._statut = value
        else:
            print(f"Erreur : statut doit être 1, 2 ou 3. Valeur inchangée ({self._statut}).")

    # --- Affichage ---
    def __str__(self):
        return (f"Robot {self.numero_serie} – {self.robot_type}\n"
                f"Statut : {Robot.statuts_possibles[self.statut]}\n"
                f"Orientation : {self.orientation}")

    # --- Tourner ---
    def tourner(self, direction):
        if direction not in [1, -1]:
            print("Erreur : direction doit être 1 (horaire) ou -1 (anti-horaire).")
            return
        idx = Robot.orientations_possibles.index(self._orientation)
        self._orientation = Robot.orientations_possibles[(idx + direction) % 4]
