# EN: Class representing a 3D printer.
# DE: Klasse, die einen 3D-Drucker darstellt.
class Drucker:
    """
    EN: Represents a printer with its name and operational parameters.
    DE: Repräsentiert einen Drucker mit seinem Namen und seinen Betriebsparametern.
    """

    def __init__(self, name: str, max_laenge: float, max_breite: float, max_hoehe: float, druckzeit_faktor: float, stundensatz: float):
        """
        EN: Initializes a new Printer object.
        DE: Initialisiert ein neues Drucker-Objekt.

        Args:
            name (str): EN: Name of the printer. / DE: Name des Druckers.
            max_laenge (float): EN: Maximum build length in cm. / DE: Maximale Baulänge in cm.
            max_breite (float): EN: Maximum build width in cm. / DE: Maximale Baubreite in cm.
            max_hoehe (float): EN: Maximum build height in cm. / DE: Maximale Bauhöhe in cm.
            druckzeit_faktor (float): EN: Factor for print speed. / DE: Faktor für die Druckgeschwindigkeit.
            stundensatz (float): EN: Cost per hour of operation in €. / DE: Kosten pro Betriebsstunde in €.
        """
        self.name = name
        self.max_laenge = max_laenge          # EN: Maximum length in cm / DE: Maximale Länge in cm
        self.max_breite = max_breite          # EN: Maximum width in cm / DE: Maximale Breite in cm
        self.max_hoehe = max_hoehe            # EN: Maximum height in cm / DE: Maximale Höhe in cm
        self.druckzeit_faktor = druckzeit_faktor # EN: Print time factor / DE: Druckzeitfaktor
        self.stundensatz = stundensatz        # EN: Hourly rate / DE: Stundensatz

    @property
    def max_bauvolumen_cm3(self) -> float:
        """
        EN: Calculates the maximum build volume in cm³ based on dimensions.
        DE: Berechnet das maximale Bauvolumen in cm³ basierend auf den Abmessungen.
        """
        return self.max_laenge * self.max_breite * self.max_hoehe

    def __str__(self) -> str:
        """
        EN: Returns a user-friendly summary of the printer.
        DE: Gibt eine benutzerfreundliche Zusammenfassung des Druckers zurück.
        """
        return (f"{self.name} (Max. Baugröße: {self.max_laenge}x{self.max_breite}x{self.max_hoehe} cm, "
                f"Stundensatz: {self.stundensatz:.2f} €/h)")

    def __repr__(self) -> str:
        """
        EN: Returns an unambiguous string representation of the object.
        DE: Gibt eine eindeutige Zeichenkettendarstellung des Objekts zurück.
        """
        return (f"Drucker(name={self.name!r}, max_laenge={self.max_laenge!r}, "
                f"max_breite={self.max_breite!r}, max_hoehe={self.max_hoehe!r}, "
                f"druckzeit_faktor={self.druckzeit_faktor!r}, stundensatz={self.stundensatz!r})")