const COPY_FEEDBACK_MS = 2000;

export async function writeClipboardText(text) {
    const value = String(text ?? '');
    if (!value) {
        return false;
    }

    try {
        if (navigator.clipboard?.writeText) {
            await navigator.clipboard.writeText(value);

            return true;
        }
    } catch {
        // fall through to legacy copy
    }

    try {
        const textarea = document.createElement('textarea');
        textarea.value = value;
        textarea.style.position = 'fixed';
        textarea.style.opacity = '0';
        document.body.appendChild(textarea);
        textarea.select();
        const ok = document.execCommand('copy');
        document.body.removeChild(textarea);

        return ok;
    } catch {
        return false;
    }
}

export function registerLadillClipboard(Alpine) {
    Alpine.data('copyButton', (text = '') => ({
        copied: false,
        text: text ?? '',
        resetTimer: null,
        async copy() {
            const ok = await writeClipboardText(this.text);
            if (!ok) {
                return;
            }

            this.copied = true;

            if (this.resetTimer) {
                clearTimeout(this.resetTimer);
            }

            this.resetTimer = setTimeout(() => {
                this.copied = false;
            }, COPY_FEEDBACK_MS);
        },
    }));
}
