"""
EN: Calculation and business logic service for the BBW University Research Platform backend.
    - Provides static methods for material weight and cost calculation.
    - Integrates validation service for data integrity.
DE: Berechnungs- und Geschäftslogikdienst für das Backend der Forschungsplattform der bbw Hochschule.
    - Stellt statische Methoden zur Berechnung von Materialgewicht und Kosten bereit.
    - Integriert Validierungsdienst zur Sicherstellung der Datenintegrität.
"""

# DE: Klasse für die Durchführung von Berechnungen und Geschäftslogik.
# EN: Class for performing calculations and business logic.

# EN: Import model classes for type hinting and data access.
# DE: Importieren von Modellklassen für Typ-Hinweise und Datenzugriff.
from app.models.drucker import Drucker
from app.models.material import Material
from app.models.qualitaet import Qualitaet
from app.models.teil import Teil
import logging

# EN: Import the validation service to ensure data integrity before calculations.
# DE: Importieren des Validierungsdienstes, um die Datenintegrität vor den Berechnungen sicherzustellen.
from app.services.validierungs_dienst import Validierungsdienst


class Berechnungsdienst:
    """
    DE: Eine statische Utility-Klasse, die reine Berechnungsfunktionen für die
        Geschäftslogik bereitstellt. Diese Klasse hat keinen eigenen Zustand.
    EN: A static utility class that provides pure calculation functions for the
        business logic. This class has no state of its own.
    """

    @staticmethod
    def berechne_materialgewicht(teil: Teil, material: Material) -> float:
        """
        DE: Berechnet das für ein Teil benötigte Materialgewicht in Gramm.
        EN: Calculates the required material weight for a part in grams.
        """
        logging.debug(
            f"DEBUG: Validierung des Materials '{material.name}'. cost_kg: {material.cost_kg}, dichte: {material.dichte}")

        # EN: First, validate the properties of the objects to ensure they are valid for calculation.
        # DE: Zuerst die Eigenschaften der Objekte validieren, um sicherzustellen, dass sie für die Berechnung gültig sind.
        Validierungsdienst.pruefe_gueltige_teil_eigenschaften(teil)
        Validierungsdienst.pruefe_gueltige_material_eigenschaften(material)

        # EN: Calculate the weight by multiplying the part's volume by the material's density.
        # DE: Das Gewicht durch Multiplikation des Teilvolumens mit der Materialdichte berechnen.
        return round((teil.volumen * material.dichte), 2)

    @staticmethod
    def berechne_kosten(teil: Teil, material: Material, drucker: Drucker, qualitaet: Qualitaet,
                        benoetigtes_gewicht_kg: float) -> float:
        """
        DE: Berechnet die Gesamtdruckkosten basierend auf Material und Maschinenzeit.
            Diese Methode geht davon aus, dass alle Eingaben bereits validiert wurden.
        EN: Calculates the total printing cost based on material and machine time.
            This method assumes all inputs have already been validated.
        """
        Validierungsdienst.pruefe_gueltige_drucker_eigenschaften(drucker)
        Validierungsdienst.pruefe_gueltige_qualitaet_eigenschaften(qualitaet)

        materialkosten = benoetigtes_gewicht_kg * material.cost_kg

        druckzeit_stunden = teil.volumen / drucker.druckzeit_faktor

        maschinen_kosten = druckzeit_stunden * drucker.stundensatz

        gesamtkosten = materialkosten + (maschinen_kosten * qualitaet.faktor)

        return round(gesamtkosten, 2)