"""Inspect and render the Meshy rig in Blender before game integration."""
import bpy
import json
import sys
from pathlib import Path
from mathutils import Vector

root = Path(__file__).resolve().parents[2]
source = root / 'tools/character-art/source/meshy_v2'
bpy.ops.wm.read_factory_settings(use_empty=True)
input_name = sys.argv[sys.argv.index('--') + 1] if '--' in sys.argv else 'cook_rigged.glb'
prefix = Path(input_name).stem
bpy.ops.import_scene.gltf(filepath=str(source / input_name))
report = {'objects': [], 'rigs': [], 'actions': []}
points = []
for obj in bpy.context.scene.objects:
    report['objects'].append({'name': obj.name, 'type': obj.type})
    if obj.type == 'MESH':
        points += [obj.matrix_world @ Vector(corner) for corner in obj.bound_box]
    if obj.type == 'ARMATURE':
        report['rigs'].append({'name': obj.name, 'matrix': [list(row) for row in obj.matrix_world], 'bones': [
            {'name': b.name, 'parent': b.parent.name if b.parent else None,
             'head': list(b.head_local), 'tail': list(b.tail_local),
             'quaternion': list(b.matrix_local.to_quaternion())} for b in obj.data.bones]})
for action in bpy.data.actions:
    report['actions'].append({'name': action.name, 'range': list(action.frame_range)})
(source / (prefix + '_inspection.json')).write_text(json.dumps(report, indent=2), encoding='utf-8')
lo = Vector(tuple(min(p[i] for p in points) for i in range(3)))
hi = Vector(tuple(max(p[i] for p in points) for i in range(3)))
center = (lo + hi) * 0.5
height = hi.z - lo.z
world = bpy.data.worlds.new('PreviewWorld'); world.use_nodes = True
world.node_tree.nodes['Background'].inputs[0].default_value = (.24,.27,.32,1)
world.node_tree.nodes['Background'].inputs[1].default_value = .6
scene = bpy.context.scene; scene.world = world
for name, loc, power in [('Key',(-3,-4,4),650),('Fill',(4,-3,2),400),('Rim',(1,3,3),700)]:
    light = bpy.data.lights.new(name, 'AREA'); light.energy = power; light.size = 4
    obj = bpy.data.objects.new(name, light); scene.collection.objects.link(obj)
    obj.location = center + Vector(loc)
    obj.rotation_euler = (center-obj.location).to_track_quat('-Z','Y').to_euler()
camera_data = bpy.data.cameras.new('PreviewCamera')
camera = bpy.data.objects.new('PreviewCamera', camera_data); scene.collection.objects.link(camera)
camera.location = center + Vector((height*1.7, -height*3, height*.25))
camera.rotation_euler = (center-camera.location).to_track_quat('-Z','Y').to_euler()
camera_data.type = 'ORTHO'; camera_data.ortho_scale = max(height*1.2, hi.x-lo.x)*1.1
scene.camera = camera
scene.render.engine = 'CYCLES'; scene.cycles.samples = 24
scene.render.resolution_x = 900; scene.render.resolution_y = 1000
scene.render.resolution_percentage = 100
scene.render.image_settings.file_format = 'PNG'
scene.render.filepath = str(source / (prefix + '_preview.png'))
bpy.ops.render.render(write_still=True)
bpy.ops.file.pack_all()
bpy.ops.wm.save_as_mainfile(filepath=str(source / (prefix + '.blend')))
print('MESHY_INSPECTION', json.dumps({'height': height, 'objects': len(report['objects']), 'rigs': len(report['rigs'])}))
