(()=>{
  function init(root=document){
    root.querySelectorAll('[data-software-selection]').forEach(container=>{
      if(container.dataset.selectionReady==='1') return;
      container.dataset.selectionReady='1';
      const table=container.querySelector('table');
      const form=container.querySelector('form[data-software-delete-form]');
      const master=container.querySelector('[data-software-select-all]');
      const button=container.querySelector('[data-software-delete-button]');
      const countNode=container.querySelector('[data-software-selection-count]');
      if(!table||!form) return;
      const boxes=()=>[...table.querySelectorAll('tbody input[data-software-entry-checkbox]')];
      const visibleBoxes=()=>boxes().filter(box=>!box.closest('tr')?.hidden);
      const update=()=>{
        const selected=boxes().filter(box=>box.checked);
        if(button) button.disabled=selected.length===0;
        if(countNode) countNode.textContent=String(selected.length);
        if(master){
          const visible=visibleBoxes();
          const selectedVisible=visible.filter(box=>box.checked).length;
          master.checked=visible.length>0&&selectedVisible===visible.length;
          master.indeterminate=selectedVisible>0&&selectedVisible<visible.length;
          master.disabled=visible.length===0;
        }
      };
      master?.addEventListener('change',()=>{ visibleBoxes().forEach(box=>box.checked=master.checked); update(); });
      table.addEventListener('change',event=>{ if(event.target.matches('[data-software-entry-checkbox]')) update(); });
      form.addEventListener('submit',event=>{
        const selected=boxes().filter(box=>box.checked);
        if(!selected.length){ event.preventDefault(); return; }
        form.querySelectorAll('input[data-generated-entry-id]').forEach(node=>node.remove());
        selected.forEach(box=>{ const input=document.createElement('input'); input.type='hidden'; input.name='entry_ids'; input.value=box.value; input.dataset.generatedEntryId='1'; form.appendChild(input); });
        const template=form.dataset.confirmTemplate||'Delete {count} selected software inventory entries?';
        const warning=form.dataset.inventoryOnlyWarning||'';
        const message=template.replace('{count}',String(selected.length))+(warning?'\n\n'+warning:'');
        if(!window.confirm(message)) event.preventDefault();
      });
      window.addEventListener('asset-table-filter-changed',event=>{ if(event.detail?.table===table) update(); });
      update();
    });
  }
  document.addEventListener('DOMContentLoaded',()=>init());
  window.AssetManagerSoftwareSelection={init};
})();
