bl_info = {
    "name": "B-Bonify Clean Version",
    "author": "Nukorio",
    "version": (2, 2),
    "blender": (4, 4, 0),
    "description": "Simple reliable BBS/BBE system with casing preserved, no coloring.",
    "category": "Rigging",
}

import bpy

def bonify_bone(ebone, arm, obj):
    full_name = ebone.name
    bone_name = full_name[4:]

    # Always use uppercase BBS and BBE regardless of casing
    bbs_name = f"BBS_{bone_name}"
    bbe_name = f"BBE_{bone_name}"

    bbs = arm.edit_bones.new(bbs_name)
    bbe = arm.edit_bones.new(bbe_name)

    bbs.head = ebone.head.copy()
    bbs.tail = ebone.head.copy() + (ebone.tail - ebone.head) * 0.1

    bbe.head = ebone.tail.copy()
    bbe.tail = ebone.tail.copy() + (ebone.tail - ebone.head) * 0.1

    ebone.head = bbs.head.copy()
    ebone.tail = bbe.head.copy()

    ebone.bbone_segments = 8
    ebone.bbone_handle_type_start = 'AUTO'
    ebone.bbone_handle_type_end = 'AUTO'

    ebone.parent = bbs
    ebone.use_connect = False

class BONEIFY_OT_bonify(bpy.types.Operator):
    bl_idname = "object.b_bonify"
    bl_label = "B-Bonify Clean Version"
    bl_description = "BBS/BBE system with casing preserved and no coloring."
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
        obj = context.object
        if not obj or obj.type != 'ARMATURE':
            self.report({'WARNING'}, "Select an Armature.")
            return {'CANCELLED'}

        selected_names = [b.name for b in obj.data.bones if b.select and b.name.lower().startswith("def_")]

        if not selected_names:
            self.report({'WARNING'}, "Select bones with DEF_ prefix (any casing).")
            return {'CANCELLED'}

        bpy.ops.object.mode_set(mode='EDIT')
        for name in selected_names:
            ebone = obj.data.edit_bones[name]
            bonify_bone(ebone, obj.data, obj)

        bpy.ops.object.mode_set(mode='OBJECT')
        bpy.ops.object.mode_set(mode='POSE')

        for name in selected_names:
            full_name = name
            bone_name = full_name[4:]
            bbs_name = f"BBS_{bone_name}"
            bbe_name = f"BBE_{bone_name}"

            pbone = obj.pose.bones[name]

            stretch = pbone.constraints.new('STRETCH_TO')
            stretch.target = obj
            stretch.subtarget = bbe_name
            stretch.volume = 'NO_VOLUME'

        bpy.ops.object.mode_set(mode='OBJECT')
        return {'FINISHED'}

class BONEIFY_PT_panel(bpy.types.Panel):
    bl_label = "B-Bonify Clean Version"
    bl_idname = "OBJECT_PT_bonify_clean"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = 'B-Bonify'

    def draw(self, context):
        layout = self.layout
        layout.operator("object.b_bonify", icon='BONE_DATA')

def register():
    bpy.utils.register_class(BONEIFY_OT_bonify)
    bpy.utils.register_class(BONEIFY_PT_panel)

def unregister():
    bpy.utils.unregister_class(BONEIFY_OT_bonify)
    bpy.utils.unregister_class(BONEIFY_PT_panel)

if __name__ == "__main__":
    register()
