"""
EN: STL processing service for the BBW University Research Platform backend.
    - Processes STL files and extracts part data (dimensions, volume).
DE: STL-Verarbeitungsdienst für das Backend der Forschungsplattform der bbw Hochschule.
    - Verarbeitet STL-Dateien und extrahiert Teildaten (Abmessungen, Volumen).
"""

import tempfile
import os
import shutil
from stl import mesh
from app.models.teil import Teil
from app.ausnahmen.ausnahmeverwaltung import ValidierungsFehler


class STLVerarbeitungsdienst:
    """
    DE: Ein Dienst zum Verarbeiten von STL-Dateien, um Teildaten zu extrahieren.
    EN: A service for processing STL files to extract part data.
    """

    @staticmethod
    def erstelle_teil_aus_datei(datei_stream, datei_name: str) -> Teil:
        temp_pfad = None
        try:
            # Create a temporary file to store the uploaded STL file
            with tempfile.NamedTemporaryFile(mode='wb', delete=False, suffix=".stl") as temp:
                shutil.copyfileobj(datei_stream, temp)
                temp_pfad = temp.name

            # Load the STL file as a mesh
            stl_mesh = mesh.Mesh.from_file(temp_pfad)

            # Calculate volume in cm^3 (assuming the unit in the STL file is mm)
            volumen_cm3 = stl_mesh.get_mass_properties()[0] / 1000.0

            # Calculate dimensions in cm (assuming the unit in the STL file is mm)
            breite_cm = (stl_mesh.x.max() - stl_mesh.x.min()) / 10.0
            laenge_cm = (stl_mesh.y.max() - stl_mesh.y.min()) / 10.0
            hoehe_cm = (stl_mesh.z.max() - stl_mesh.z.min()) / 10.0

            # Return a Teil object with the extracted data
            return Teil(
                name=datei_name,
                hoehe=hoehe_cm,
                laenge=laenge_cm,
                breite=breite_cm,
                farbe="N/A",
                volumen=volumen_cm3
            )
        except Exception as e:
            raise ValidierungsFehler(
                f"Die STL-Datei '{datei_name}' konnte nicht verarbeitet werden: {e}",
                f"Could not process STL file '{datei_name}': {e}"
            )
        finally:
            # Clean up: remove the temporary file if it exists
            if temp_pfad and os.path.exists(temp_pfad):
                os.remove(temp_pfad)