"""
EN: Handles STL file uploads and extracts 3D model properties for the 3D printing web application.
    - Receives an STL file via POST request.
    - Validates the file type and saves it temporarily.
    - Uses numpy-stl to extract volume and dimensions (width, length, height).
    - Returns the extracted properties as JSON.
    - Cleans up the temporary file after processing.
DE: Verarbeitet STL-Datei-Uploads und extrahiert 3D-Modell-Eigenschaften für die 3D-Druck-Webanwendung.
    - Empfängt eine STL-Datei per POST-Anfrage.
    - Prüft den Dateityp und speichert sie temporär.
    - Nutzt numpy-stl, um Volumen und Abmessungen (Breite, Länge, Höhe) zu extrahieren.
    - Gibt die extrahierten Eigenschaften als JSON zurück.
    - Löscht die temporäre Datei nach der Verarbeitung.
"""
from flask import request, jsonify
from stl import mesh
import tempfile
import os

# EN/DE: Endpoint function for STL file upload and analysis.
def upload_stl():
    """
    EN: Receives an STL file, extracts volume and dimensions, and returns them as JSON.
    DE: Empfängt eine STL-Datei, extrahiert Volumen und Abmessungen und gibt sie als JSON zurück.
    """
    if 'file' not in request.files:
        return jsonify({"error": "No file uploaded"}), 400

    file = request.files['file']
    if not file.filename or not file.filename.lower().endswith('.stl'):
        return jsonify({"error": "Invalid file type, .stl required"}), 400

    temp_file_path = None
    try:
        with tempfile.NamedTemporaryFile(delete=False, suffix=".stl") as temp_handle:
            file.save(temp_handle)
            temp_file_path = temp_handle.name

        stl_mesh = mesh.Mesh.from_file(temp_file_path)

        volume_mm3, _, _ = stl_mesh.get_mass_properties()

        minx, maxx = stl_mesh.x.min(), stl_mesh.x.max()
        miny, maxy = stl_mesh.y.min(), stl_mesh.y.max()
        minz, maxz = stl_mesh.z.min(), stl_mesh.z.max()

        breite = maxx - minx
        laenge = maxy - miny
        hoehe = maxz - minz

        return jsonify({
            "volume_mm3": round(volume_mm3, 2),
            "breite": round(breite, 2),
            "laenge": round(laenge, 2),
            "hoehe": round(hoehe, 2)
        })

    except Exception as e:
        print(f"Error processing STL file: {e}")
        return jsonify({"error": "Could not read the STL file. It may be corrupted."}), 500

    finally:
        if temp_file_path and os.path.exists(temp_file_path):
            os.remove(temp_file_path)
