import bpy
import sys
from pathlib import Path


def reset_scene():
    bpy.ops.object.select_all(action="SELECT")
    bpy.ops.object.delete(use_global=False)
    for datablocks in (bpy.data.meshes, bpy.data.materials, bpy.data.images):
        for datablock in list(datablocks):
            datablocks.remove(datablock)


def import_source(source):
    bpy.ops.import_scene.gltf(filepath=str(source))
    meshes = [obj for obj in bpy.context.scene.objects if obj.type == "MESH"]
    if len(meshes) != 1:
        raise RuntimeError(f"Expected one mesh, found {len(meshes)}")
    mesh = meshes[0]
    bpy.context.view_layer.objects.active = mesh
    mesh.select_set(True)
    return mesh


def export_lod(source, destination, target_faces):
    reset_scene()
    mesh = import_source(source)
    source_faces = len(mesh.data.polygons)
    ratio = min(1.0, target_faces / max(1, source_faces))
    modifier = mesh.modifiers.new(name=f"TN Web LOD {target_faces}", type="DECIMATE")
    modifier.decimate_type = "COLLAPSE"
    modifier.ratio = ratio
    modifier.use_collapse_triangulate = True
    bpy.context.view_layer.objects.active = mesh
    bpy.ops.object.modifier_apply(modifier=modifier.name)

    for polygon in mesh.data.polygons:
        polygon.use_smooth = True

    mesh.name = "TN_Noble_Shield_Ring"
    mesh.data.name = "TN_Noble_Shield_Ring_Geometry"
    destination.parent.mkdir(parents=True, exist_ok=True)
    bpy.ops.export_scene.gltf(
        filepath=str(destination),
        export_format="GLB",
        use_selection=False,
        export_apply=True,
        export_texcoords=False,
        export_normals=True,
        export_tangents=False,
        export_materials="EXPORT",
        export_cameras=False,
        export_lights=False,
        export_animations=False,
        export_yup=True,
    )
    print(
        f"TN_EXPORT {destination.name} "
        f"faces={len(mesh.data.polygons)} vertices={len(mesh.data.vertices)}"
    )


if __name__ == "__main__":
    args = sys.argv[sys.argv.index("--") + 1 :]
    source_path = Path(args[0])
    output_dir = Path(args[1])
    export_lod(source_path, output_dir / "ring-desktop.glb", 250_000)
    export_lod(source_path, output_dir / "ring-mobile.glb", 100_000)
