(() => {

    /*----------------------------------------
    フィードバック非表示タイマー（要素ごとに保持）
    ----------------------------------------*/
    const hideTimers = new WeakMap();


    /*----------------------------------------
    クリップボードAPIが使えない場合のコピー処理
    ----------------------------------------*/
    function copyViaTextarea(text) {

        const textarea = document.createElement('textarea');

        textarea.value = text;
        textarea.setAttribute('readonly', '');
        textarea.style.position = 'absolute';
        textarea.style.left = '-9999px';

        document.body.appendChild(textarea);

        textarea.select();

        let copied = false;

        try {
            copied = document.execCommand('copy');
        } catch (error) {
            copied = false;
        }

        document.body.removeChild(textarea);

        return copied;

    }


    /*----------------------------------------
    フォーム一覧：ショートコードをクリップボードへコピー
    アイコンボタン・ショートコード表示欄のどちらの
    クリックでも同じコピー処理を行う。
    ----------------------------------------*/
    document.addEventListener('click', async (event) => {

        const codeTarget = event.target.closest(
            '[data-shortcode-copy-target]'
        );

        // ショートコード欄でテキストを選択中の場合はコピーしない
        if (
            codeTarget &&
            window.getSelection().toString() !== ''
        ) {
            return;
        }

        const trigger = event.target.closest(
            '[data-shortcode-copy-button], [data-shortcode-copy-target]'
        );

        if (!trigger) {
            return;
        }

        const wrapper = trigger.closest(
            '.im-mail-form-shortcode'
        );

        const button = wrapper
            ? wrapper.querySelector(
                '[data-shortcode-copy-button]'
            )
            : null;

        if (!button) {
            return;
        }

        const shortcode = button.dataset.shortcode || '';

        if (!shortcode) {
            return;
        }

        let copied = false;

        try {

            if (
                navigator.clipboard &&
                window.isSecureContext
            ) {

                await navigator.clipboard.writeText(
                    shortcode
                );

                copied = true;

            } else {

                copied = copyViaTextarea(shortcode);

            }

        } catch (error) {

            copied = copyViaTextarea(shortcode);

        }

        if (!copied) {
            return;
        }

        const status = wrapper
            ? wrapper.querySelector(
                '[data-shortcode-copy-status]'
            )
            : null;

        const copyLabel = button.dataset.copyLabel || '';
        const copiedLabel = button.dataset.copiedLabel || '';

        button.classList.add('is-copied');

        if (copiedLabel) {
            button.setAttribute('aria-label', copiedLabel);
        }

        if (status) {
            status.textContent = copiedLabel;
        }

        window.clearTimeout(
            hideTimers.get(button)
        );

        hideTimers.set(
            button,
            window.setTimeout(
                () => {

                    button.classList.remove('is-copied');

                    if (copyLabel) {
                        button.setAttribute('aria-label', copyLabel);
                    }

                    if (status) {
                        status.textContent = '';
                    }

                },
                2000
            )
        );

    });

})();
