function rebuildIndex() {
    openModal({ title: 'Rebuilding search index…', body: 'Walking the wiki tree.' });
    fetch('/_reindex', { method: 'POST' })
        .then(function (resp) {
            if (!resp.ok) throw new Error('rebuild failed: ' + resp.status);
            window.location.href = window.location.href;
        })
        .catch(function (err) {
            closeModal();
            openModal({ title: 'Rebuild failed', body: String(err), confirm: { label: 'OK' } });
        });
}

function encodeSearchPath(p) {
    if (p === '/' || p === '') return '/';
    return '/' + p.replace(/^\/+/, '').split('/').map(encodeURIComponent).join('/');
}

// createSearchPage runs the new-page flow (pick a parent folder, then confirm
// the name) starting from the search query, so a query with no exact page can
// be turned into that page in one step. The name field is pre-filled with the
// query but stays editable.
function createSearchPage(name) {
    var current = decodeURIComponent(window.location.pathname).replace(/\/+$/, '') || '/';
    openTreePicker({
        title: 'New page — where?',
        mode: 'folder',
        initialPath: current,
        preselect: current,
        hideFiles: true,
        confirmLabel: 'NEXT',
        onSelect: function (parentPath) {
            var input = document.createElement('input');
            input.type = 'text';
            input.className = 'input';
            input.placeholder = 'Page name';
            input.value = name || '';
            openModal({
                title: 'New page — name?',
                body: input,
                confirm: {
                    label: 'CREATE',
                    onConfirm: function () {
                        var finalName = input.value.trim();
                        if (!finalName) return;
                        var base = parentPath === '/' ? '/' : encodeSearchPath(parentPath) + '/';
                        window.location.href = base + encodeURIComponent(finalName) + '/?edit';
                    }
                }
            });
        }
    });
}

document.addEventListener('DOMContentLoaded', function () {
    wireDropdown(document.querySelector('[data-action="actions-drop"]'));

    var createLink = document.querySelector('[data-create-page]');
    if (createLink) {
        createLink.addEventListener('click', function (e) {
            e.preventDefault();
            createSearchPage(createLink.getAttribute('data-create-page'));
        });
    }

    // Focus the search input on results pages so Tab steps directly into the
    // first match — the input sits immediately before the results in DOM
    // order, so the natural tab sequence is input → first result → next, …
    var input = document.querySelector('.search-input');
    if (input && input.value) {
        input.focus();
        var end = input.value.length;
        try { input.setSelectionRange(end, end); } catch (e) {}
    }
});
