import bpy

from .paw import Rig as pawRig
from .paw import parameters_ui
from .paw import add_parameters

IMPLEMENTATION = True   # Include and set True if Rig is just an implementation for a wrapper class
                        # add_parameters and parameters_ui are unused for implementation classes


class Rig(pawRig):

    def __init__(self, obj, bone_name, params):
        super(Rig, self).__init__(obj, bone_name, params)


def create_sample(obj):
    # generated by rigify.utils.write_metarig
    bpy.ops.object.mode_set(mode='EDIT')
    arm = obj.data

    bones = {}

    bone = arm.edit_bones.new('thigh.L')
    bone.head[:] = 0.0291, 0.1181, 0.2460
    bone.tail[:] = 0.0293, 0.1107, 0.1682
    bone.roll = 3.1383
    bone.use_connect = False
    bones['thigh.L'] = bone.name
    bone = arm.edit_bones.new('shin.L')
    bone.head[:] = 0.0293, 0.1107, 0.1682
    bone.tail[:] = 0.0293, 0.1684, 0.1073
    bone.roll = 3.1416
    bone.use_connect = True
    bone.parent = arm.edit_bones[bones['thigh.L']]
    bones['shin.L'] = bone.name
    bone = arm.edit_bones.new('foot.L')
    bone.head[:] = 0.0293, 0.1684, 0.1073
    bone.tail[:] = 0.0293, 0.1530, 0.0167
    bone.roll = 3.1416
    bone.use_connect = True
    bone.parent = arm.edit_bones[bones['shin.L']]
    bones['foot.L'] = bone.name
    bone = arm.edit_bones.new('r_toe.L')
    bone.head[:] = 0.0293, 0.1530, 0.0167
    bone.tail[:] = 0.0293, 0.1224, 0.0167
    bone.roll = 0.0000
    bone.use_connect = True
    bone.parent = arm.edit_bones[bones['foot.L']]
    bones['r_toe.L'] = bone.name
    bone = arm.edit_bones.new('r_palm.001.L')
    bone.head[:] = 0.0220, 0.1457, 0.0123
    bone.tail[:] = 0.0215, 0.1401, 0.0123
    bone.roll = 0.0014
    bone.use_connect = False
    bone.parent = arm.edit_bones[bones['r_toe.L']]
    bones['r_palm.001.L'] = bone.name
    bone = arm.edit_bones.new('r_palm.002.L')
    bone.head[:] = 0.0297, 0.1458, 0.0123
    bone.tail[:] = 0.0311, 0.1393, 0.0123
    bone.roll = -0.0005
    bone.use_connect = False
    bone.parent = arm.edit_bones[bones['r_toe.L']]
    bones['r_palm.002.L'] = bone.name
    bone = arm.edit_bones.new('r_palm.003.L')
    bone.head[:] = 0.0363, 0.1473, 0.0123
    bone.tail[:] = 0.0376, 0.1407, 0.0123
    bone.roll = 0.0000
    bone.use_connect = False
    bone.parent = arm.edit_bones[bones['r_toe.L']]
    bones['r_palm.003.L'] = bone.name
    bone = arm.edit_bones.new('r_palm.004.L')
    bone.head[:] = 0.0449, 0.1501, 0.0123
    bone.tail[:] = 0.0466, 0.1479, 0.0123
    bone.roll = -0.0004
    bone.use_connect = False
    bone.parent = arm.edit_bones[bones['r_toe.L']]
    bones['r_palm.004.L'] = bone.name
    bone = arm.edit_bones.new('r_index.001.L')
    bone.head[:] = 0.0215, 0.1367, 0.0087
    bone.tail[:] = 0.0217, 0.1325, 0.0070
    bone.roll = -0.3427
    bone.use_connect = False
    bone.parent = arm.edit_bones[bones['r_palm.001.L']]
    bones['r_index.001.L'] = bone.name
    bone = arm.edit_bones.new('r_middle.001.L')
    bone.head[:] = 0.0311, 0.1358, 0.0117
    bone.tail[:] = 0.0324, 0.1297, 0.0092
    bone.roll = -1.0029
    bone.use_connect = False
    bone.parent = arm.edit_bones[bones['r_palm.002.L']]
    bones['r_middle.001.L'] = bone.name
    bone = arm.edit_bones.new('r_ring.001.L')
    bone.head[:] = 0.0376, 0.1372, 0.0117
    bone.tail[:] = 0.0389, 0.1311, 0.0092
    bone.roll = -1.0029
    bone.use_connect = False
    bone.parent = arm.edit_bones[bones['r_palm.003.L']]
    bones['r_ring.001.L'] = bone.name
    bone = arm.edit_bones.new('r_pinky.001.L')
    bone.head[:] = 0.0466, 0.1444, 0.0083
    bone.tail[:] = 0.0476, 0.1412, 0.0074
    bone.roll = -1.7551
    bone.use_connect = False
    bone.parent = arm.edit_bones[bones['r_palm.004.L']]
    bones['r_pinky.001.L'] = bone.name
    bone = arm.edit_bones.new('r_index.002.L')
    bone.head[:] = 0.0217, 0.1325, 0.0070
    bone.tail[:] = 0.0221, 0.1271, 0.0038
    bone.roll = -0.2465
    bone.use_connect = True
    bone.parent = arm.edit_bones[bones['r_index.001.L']]
    bones['r_index.002.L'] = bone.name
    bone = arm.edit_bones.new('r_middle.002.L')
    bone.head[:] = 0.0324, 0.1297, 0.0092
    bone.tail[:] = 0.0343, 0.1210, 0.0039
    bone.roll = -0.7479
    bone.use_connect = True
    bone.parent = arm.edit_bones[bones['r_middle.001.L']]
    bones['r_middle.002.L'] = bone.name
    bone = arm.edit_bones.new('r_ring.002.L')
    bone.head[:] = 0.0389, 0.1311, 0.0092
    bone.tail[:] = 0.0407, 0.1229, 0.0042
    bone.roll = -0.7479
    bone.use_connect = True
    bone.parent = arm.edit_bones[bones['r_ring.001.L']]
    bones['r_ring.002.L'] = bone.name
    bone = arm.edit_bones.new('r_pinky.002.L')
    bone.head[:] = 0.0476, 0.1412, 0.0074
    bone.tail[:] = 0.0494, 0.1351, 0.0032
    bone.roll = -0.8965
    bone.use_connect = True
    bone.parent = arm.edit_bones[bones['r_pinky.001.L']]
    bones['r_pinky.002.L'] = bone.name

    bpy.ops.object.mode_set(mode='OBJECT')
    pbone = obj.pose.bones[bones['thigh.L']]
    pbone.rigify_type = 'limbs.super_limb'
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    try:
        pbone.rigify_parameters.limb_type = "paw"
    except AttributeError:
        pass
    try:
        pbone.rigify_parameters.fk_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
    except AttributeError:
        pass
    try:
        pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
    except AttributeError:
        pass
    try:
        pbone.rigify_parameters.segments = 2
    except AttributeError:
        pass
    pbone = obj.pose.bones[bones['shin.L']]
    pbone.rigify_type = ''
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    pbone = obj.pose.bones[bones['foot.L']]
    pbone.rigify_type = ''
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    pbone = obj.pose.bones[bones['r_toe.L']]
    pbone.rigify_type = ''
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    pbone = obj.pose.bones[bones['r_palm.001.L']]
    pbone.rigify_type = 'limbs.super_palm'
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    pbone = obj.pose.bones[bones['r_palm.002.L']]
    pbone.rigify_type = ''
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    pbone = obj.pose.bones[bones['r_palm.003.L']]
    pbone.rigify_type = ''
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    pbone = obj.pose.bones[bones['r_palm.004.L']]
    pbone.rigify_type = 'limbs.super_palm'
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    pbone = obj.pose.bones[bones['r_index.001.L']]
    pbone.rigify_type = 'limbs.simple_tentacle'
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    try:
        pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
    except AttributeError:
        pass
    pbone = obj.pose.bones[bones['r_middle.001.L']]
    pbone.rigify_type = 'limbs.simple_tentacle'
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    try:
        pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
    except AttributeError:
        pass
    pbone = obj.pose.bones[bones['r_ring.001.L']]
    pbone.rigify_type = 'limbs.simple_tentacle'
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    try:
        pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
    except AttributeError:
        pass
    pbone = obj.pose.bones[bones['r_pinky.001.L']]
    pbone.rigify_type = 'limbs.simple_tentacle'
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    try:
        pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
    except AttributeError:
        pass
    pbone = obj.pose.bones[bones['r_index.002.L']]
    pbone.rigify_type = ''
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    pbone = obj.pose.bones[bones['r_middle.002.L']]
    pbone.rigify_type = ''
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    pbone = obj.pose.bones[bones['r_ring.002.L']]
    pbone.rigify_type = ''
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'
    pbone = obj.pose.bones[bones['r_pinky.002.L']]
    pbone.rigify_type = ''
    pbone.lock_location = (False, False, False)
    pbone.lock_rotation = (False, False, False)
    pbone.lock_rotation_w = False
    pbone.lock_scale = (False, False, False)
    pbone.rotation_mode = 'QUATERNION'

    bpy.ops.object.mode_set(mode='EDIT')
    for bone in arm.edit_bones:
        bone.select = False
        bone.select_head = False
        bone.select_tail = False
    for b in bones:
        bone = arm.edit_bones[bones[b]]
        bone.select = True
        bone.select_head = True
        bone.select_tail = True
        arm.edit_bones.active = bone

    for eb in arm.edit_bones:
        if ('thigh' in eb.name) or ('shin' in eb.name) or ('foot' in eb.name) or ('toe' in eb.name):
            eb.layers = (False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False)
        else:
            eb.layers = (False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False)
    arm.layers = (False, False, False, False, False, True, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False)


if __name__ == "__main__":
    create_sample(bpy.context.active_object)
