# EN: Import the necessary model classes that constitute a print job.
# DE: Importieren der notwendigen Modellklassen, die einen Druckauftrag ausmachen.
from app.models.drucker import Drucker
from app.models.material import Material
from app.models.qualitaet import Qualitaet
from app.models.teil import Teil


# EN: Class representing a complete print job, combining all components.
# DE: Klasse, die einen vollständigen Druckauftrag darstellt und alle Komponenten kombiniert.
class Auftrag:
    """
    EN: Represents a print job, combining a part, material, quality, and printer.
        Serves as a data container for a printing operation.
    DE: Repräsentiert einen Druckauftrag, der ein Teil, ein Material, eine Qualität und einen Drucker kombiniert.
        Dient als Datencontainer für einen Druckvorgang.
    """

    def __init__(self, auftragsnummer: str, teil: Teil, material: Material, qualitaet: Qualitaet, drucker: Drucker):
        """
        EN: Initializes a new Job object.
        DE: Initialisiert ein neues Auftrag-Objekt.
        """
        # EN: Unique identifier for the job.
        # DE: Eindeutige Kennung für den Auftrag.
        self.auftragsnummer = auftragsnummer

        # EN: The Part object to be printed.
        # DE: Das zu druckende Teil-Objekt.
        self.teil = teil

        # EN: The Material object to be used.
        # DE: Das zu verwendende Material-Objekt.
        self.material = material

        # EN: The Quality object for the print.
        # DE: Das Qualität-Objekt für den Druck.
        self.qualitaet = qualitaet

        # EN: The Printer object for the print.
        # DE: Das Drucker-Objekt für den Druck.
        self.drucker = drucker

    def __str__(self) -> str:
        """
        EN: Returns a user-friendly summary of the job.
        DE: Gibt eine benutzerfreundliche Zusammenfassung des Auftrags zurück.
        """
        # EN: Calls the __str__ method of the respective component objects for a detailed view.
        # DE: Ruft die __str__-Methode der jeweiligen Komponentenobjekte auf, um eine detaillierte Ansicht zu erhalten.
        return (f"Auftrag '{self.auftragsnummer}':\n"
                f"  - Teil:     {self.teil}\n"
                f"  - Drucker:  {self.drucker}\n"
                f"  - Material: {self.material}\n"
                f"  - Qualität: {self.qualitaet}")

    def __repr__(self) -> str:
        """
        EN: Returns an unambiguous string representation of the object, useful for debugging.
        DE: Gibt eine eindeutige Zeichenkettendarstellung des Objekts zurück, nützlich für das Debugging.
        """
        return (f"Auftrag(auftragsnummer={self.auftragsnummer!r}, teil={self.teil!r}, material={self.material!r}, "
                f"qualitaet={self.qualitaet!r}, drucker={self.drucker!r})")
