import $ from 'jquery';

const body = $('body');

body.on('change', '[data-acl_picker] select', (event) => {
    const target = $(event.currentTarget);
    const value = target.val();
    const item = target.closest('.permissions-item');
    const inputs = item.find('input[type="checkbox"], input[type="radio"]');
    const hidden = item.find('input[type="hidden"][name]');
    const wrapper = target.closest('[data-acl_picker_id]');
    const type = item.data('fieldType');

    if (type === 'access') {
        inputs.each((index, input) => {
            input = $(input);
            const name = input.prop('name');
            input.prop('name', name.replace(/(.*)(\[[^\]]*\])/, `$1[${value}]`));
        });
    } else if (type === 'permissions') {
        const crudpContainer = item.find('[data-field-name]');
        inputs.each((index, input) => {
            input = $(input);
            const rand = Math.round(Math.random() * 500);
            const name = crudpContainer.data('fieldName');
            const id = input.prop('id').split('_').slice(0, -1).join('_') + `_${value}+${rand}`;
            // const key = input.data('crudpKey');
            hidden.prop('name', name.replace(/(.*)(\[[^\]]*\])/, `$1[${value}]`));
            input.prop('id', id);
            input.next('label').prop('for', id);
        });
    }

    wrapper.find('.permissions-item .button.add-item')[!value ? 'addClass' : 'removeClass']('disabled').prop('disabled', !value ? 'disabled' : null);
});

body.on('input', 'input[data-crudp-key]', (event) => {
    const target = $(event.currentTarget);
    const container = target.closest('.crudp-container');
    const hidden = container.find('input[type="hidden"][name]');
    const key = target.data('crudpKey');
    const json = JSON.parse(hidden.val() || '{}');
    json[key] = target.val();
    hidden.val(JSON.stringify(json));
});

body.on('click', '[data-acl_picker] .remove-item', (event) => {
    event.preventDefault();
    const target = $(event.currentTarget);
    const container = target.closest('.permissions-item');
    const wrapper = target.closest('[data-acl_picker_id]');
    container.remove();

    const empty = wrapper.find('.permissions-item').length === 1;

    // show the initial + button
    if (empty) {
        wrapper.find('.permissions-item.empty-list').removeClass('hidden');
    }
});

body.on('click', '[data-acl_picker] .add-item', (event) => {
    event.preventDefault();
    const target = $(event.currentTarget);
    const item = target.closest('.permissions-item');
    const wrapper = target.closest('[data-acl_picker_id]');
    const ID = wrapper.data('acl_picker_id');
    const template = document.querySelector(`template[data-id="acl_picker-${ID}"]`);

    const clone = $(template.content.firstElementChild).clone();
    clone.insertAfter(item);

    // randomize ids
    clone.find('.switch-toggle input[type="radio"]').each((index, input) => {
        input = $(input);
        const id = input.prop('id');
        const label = input.next('label');
        const rand = (Date.now().toString(36) + Math.random().toString(36).substr(2, 5)).toLowerCase();

        input.prop('id', `${id}${rand}`);
        label.prop('for', `${id}${rand}`);
    });

    // hide the initial + button
    wrapper.find('.permissions-item.empty-list').addClass('hidden');

    // disable all + buttons until one is selected
    wrapper.find('.permissions-item .button.add-item').addClass('disabled').prop('disabled', 'disabled');
});