import bpy

import random

#def main(context):
#    for ob in context.scene.objects:
#        print(ob)

class RandomDiffuseShader(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "object.random_diffuse_shader"
    bl_label = "Random Diffuse Shader"

    #@classmethod
    #def poll(cls, context):
    #    return context.active_object is not None

    def execute(self, context):
        for mat in bpy.data.materials:
            
            if not bpy.data.materials[mat.name].use_nodes == True:
                bpy.data.materials[mat.name].use_nodes = True
            
            nodes = mat.node_tree.nodes
            nTree = mat.node_tree
            
            for node in nodes:
                nodes.remove(node)
                
            nTree.nodes.new(type='ShaderNodeOutputMaterial')
            nTree.nodes.new(type='ShaderNodeBsdfPrincipled')
                
            inp = nTree.nodes['Material Output'].inputs['Surface']
            outp = nTree.nodes['Principled BSDF'].outputs['BSDF'] 
            
            nTree.links.new(inp, outp)
            
            nodes['Principled BSDF'].location.x = -300
            nodes['Principled BSDF'].inputs[0].default_value = (random.uniform(0.2,0.9),random.uniform(0.2,0.9),random.uniform(0.2,0.9),1)

            nodes['Principled BSDF'].inputs[5].default_value = (0.2)
            nodes['Principled BSDF'].inputs[7].default_value = (0.1)

        #main(context)
        return {'FINISHED'}


def register():
    bpy.utils.register_class(RandomDiffuseShader)


def unregister():
    bpy.utils.unregister_class(RandomDiffuseShader)


if __name__ == "__main__":
    register()

    # test call
    #bpy.ops.object.random_diffuse_shader()





