"""Render original material comparisons with unchanged mesh geometry."""

import argparse
import json
import sys
from pathlib import Path

import bpy
from mathutils import Vector

p = argparse.ArgumentParser(description=__doc__)
p.add_argument("inputs", type=Path)
p.add_argument("output", type=Path)
a = p.parse_args(sys.argv[sys.argv.index("--") + 1 :])
a.output.mkdir()
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete(use_global=False)
s = bpy.context.scene
s.render.engine = "CYCLES"
s.cycles.samples = 32
s.cycles.use_adaptive_sampling = False
s.cycles.seed = 7
s.render.resolution_x = 1000
s.render.resolution_y = 800
s.render.resolution_percentage = 100
s.render.pixel_aspect_x = s.render.pixel_aspect_y = 1
s.world.color = (0.08, 0.08, 0.08)
material = bpy.data.materials.new("Original teal normal study")
material.use_nodes = True
nodes = material.node_tree.nodes
links = material.node_tree.links
bsdf = nodes.get("Principled BSDF")
bsdf.inputs["Base Color"].default_value = (0.055, 0.34, 0.37, 1)
bsdf.inputs["Roughness"].default_value = 0.35
tex = nodes.new("ShaderNodeTexImage")
normal = nodes.new("ShaderNodeNormalMap")
normal.space = "TANGENT"
normal.uv_map = "UVMap"
links.new(tex.outputs["Color"], normal.inputs["Color"])
links.new(normal.outputs["Normal"], bsdf.inputs["Normal"])
images = {}
for name in ["opengl", "directx"]:
    image = bpy.data.images.load(str(a.inputs / f"normal-{name}.png"))
    image.colorspace_settings.name = "Non-Color"
    image.pack()
    images[name] = image
bpy.ops.mesh.primitive_plane_add(size=3, location=(0, 0, 0.15))
panel = bpy.context.object
panel.name = "Original four vertex panel"
panel.data.materials.append(material)
base_material = bpy.data.materials.new("Navy support")
base_material.use_nodes = True
base_material.node_tree.nodes.get("Principled BSDF").inputs["Base Color"].default_value = (
    0.025,
    0.045,
    0.065,
    1,
)
bpy.ops.mesh.primitive_cube_add(size=1, location=(0, 0, 0.02))
base = bpy.context.object
base.name = "Support block"
base.scale = (3.15, 3.15, 0.2)
bpy.ops.object.transform_apply(location=False, rotation=False, scale=True)
base.data.materials.append(base_material)
mod = base.modifiers.new("Support bevel", "BEVEL")
mod.width = 0.06
mod.segments = 3
base.modifiers.new("Normals", "WEIGHTED_NORMAL")
bpy.ops.object.camera_add(location=(3.3, -4.7, 5.5))
cam = bpy.context.object
cam.name = "Fixed material camera"
cam.rotation_euler = (Vector((0, 0, 0.15)) - cam.location).to_track_quat("-Z", "Y").to_euler()
cam.data.type = "ORTHO"
cam.data.ortho_scale = 5.4
s.camera = cam
for loc, power, size in [((-3, -2, 5), 950, 2), ((3, 2, 4), 500, 3)]:
    bpy.ops.object.light_add(type="AREA", location=loc)
    o = bpy.context.object
    o.data.energy = power
    o.data.size = size
    o.rotation_euler = (Vector((0, 0, 0)) - o.location).to_track_quat("-Z", "Y").to_euler()
records = []
for name, image, convention, strength in [
    ("normal-flat", "opengl", "OPENGL", 0),
    ("normal-gl-correct", "opengl", "OPENGL", 1),
    ("normal-dx-wrong", "directx", "OPENGL", 1),
    ("normal-dx-correct", "directx", "DIRECTX", 1),
]:
    tex.image = images[image]
    normal.convention = convention
    normal.inputs["Strength"].default_value = strength
    s.render.filepath = str(a.output / f"{name}.png")
    bpy.ops.render.render(write_still=True)
    records.append(
        {
            "name": name,
            "image": image,
            "imageColorSpace": tex.image.colorspace_settings.name,
            "convention": normal.convention,
            "strength": strength,
            "panelVertices": len(panel.data.vertices),
            "panelModifiers": len(panel.modifiers),
            "cameraMatrix": [list(row) for row in cam.matrix_world],
        }
    )
tex.image = images["opengl"]
normal.convention = "OPENGL"
normal.inputs["Strength"].default_value = 1
bpy.ops.wm.save_as_mainfile(filepath=str(a.output / "normal-map-study.blend"))
(a.output / "normal-native-record.json").write_text(
    json.dumps(
        {
            "Blender": bpy.app.version_string,
            "scope": "Original native material comparison with unchanged four vertex panel geometry not recovered mesh or model inference",
            "size": [1000, 800],
            "records": records,
        },
        indent=2,
    )
    + "\n"
)
