# Reussir dans la POO c'est se rapprocher au plus pret de la realite
from typing import Self


class Fraction:
    def __init__(self, numerateur, denominateur):
        # Attributs
        self.numerateur = numerateur # tiers.numerateur = 1
        self.denominateur = denominateur
        self.simplifier()

    def quotient(self):
        return self.numerateur / self.denominateur
    
    @classmethod # decorateur
    def from_str(cls, num: str, den: str):
        return cls(numerateur= int(num), denominateur= int(den))
    
    @staticmethod # Pas de 'self' => Helpers
    def pgcd(a, b):
        if b == 0: return a
        return Fraction.pgcd(a= b, b= a % b)
    
    def simplifier(self):
        a = self.numerateur
        b = self.denominateur
        pgcd = Fraction.pgcd(a, b)

        self.numerateur = self.numerateur // pgcd
        self.denominateur //= pgcd
    
    def __add__(self, fraction):
        num = (self.numerateur * fraction.denominateur) + (self.denominateur * fraction.numerateur)
        den = self.denominateur * fraction.denominateur
        return Fraction(numerateur= num, denominateur= den)
    
    def __mul__(self, facteur: int | Self):
        if isinstance(facteur, int):
            return Fraction(
                numerateur= self.numerateur * facteur,
                denominateur= self.denominateur
                )
        return Fraction(
            numerateur= self.numerateur * facteur.numerateur,
            denominateur= self.denominateur * facteur.denominateur
        )
    
    def __rmul__(self, nombre: int):
        return self.__mul__(nombre)
    
    def __repr__(self):
        return f"Fraction({self.numerateur}/{self.denominateur})"
    
# le PGCD de 146 et 248
fraction = Fraction.from_str('2', '5')
print(fraction * 2)
print(2 * fraction)