# -*- coding: utf-8 -*-
"""Rendert Vorschaubilder fuer Materialien der BaseMaterials-CSV.

Wird vom Add-on als Hintergrundprozess gestartet (previews.starte_render):
  blender --background preview_scene.blend --factory-startup --python render_preview.py -- \
      <addon_ordner> <icons_ordner> [nur_material_name]

Ohne Namensargument werden ALLE Materialien der CSV gerendert (Erstbefuellung).
Bewusst ohne Add-on-Import: Die CSV-Spaltennamen entsprechen den Eingaengen
des Principled BSDF (ausser Category/Name), darueber wird direkt zugewiesen.
"""
import csv
import os
import re
import sys

import bpy

argv = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []
if not argv:
    raise SystemExit("Aufruf: ... -- <addon_ordner> [icons_ordner] [material_name]")
ADDON_DIR = argv[0]
ICONS_DIR = argv[1] if len(argv) > 1 else os.path.join(ADDON_DIR, "icons")
NUR_NAME = argv[2] if len(argv) > 2 else None

os.makedirs(ICONS_DIR, exist_ok=True)

with open(os.path.join(ADDON_DIR, "materials.csv"), newline="", encoding="utf-8") as f:
    zeilen = list(csv.reader(f))
kopf, daten = zeilen[0], zeilen[1:]

szene = bpy.context.scene
objekt = next((o for o in bpy.data.objects if o.type == "MESH"), None)
if objekt is None:
    raise SystemExit("Kein Mesh-Objekt in der Preview-Szene!")

mat = bpy.data.materials.new(name="BaseMaterialPreview")
mat.use_nodes = True
if objekt.material_slots:
    objekt.material_slots[0].material = mat
else:
    objekt.data.materials.append(mat)
bsdf = mat.node_tree.nodes.get("Principled BSDF")
if bsdf is None:
    raise SystemExit("Kein Principled BSDF im Preview-Material!")

anzahl = 0
for zeile in daten:
    if len(zeile) < len(kopf):
        continue
    werte = dict(zip(kopf, zeile))
    name = werte.get("Name", "")
    if NUR_NAME and name != NUR_NAME:
        continue
    for spalte, roh in werte.items():
        if spalte in ("Category", "Name") or spalte not in bsdf.inputs:
            continue
        if "," in roh:
            bsdf.inputs[spalte].default_value = [float(x) for x in roh.split(",")]
        else:
            bsdf.inputs[spalte].default_value = float(roh)
    datei = re.sub(r"[^A-Za-z0-9_-]", "_", name) + ".png"
    szene.render.filepath = os.path.join(ICONS_DIR, datei)
    bpy.ops.render.render(write_still=True)
    anzahl += 1
    print(f"  gerendert: {werte.get('Category', '?')}/{name}")

print(f"FERTIG: {anzahl} Vorschaubild(er) in {ICONS_DIR}")
