javascript: (
    function () {
        const pollInterval = 69;
        const resultWaitTime = 420;
        const defaultIndentation = 4;
        if (!document.getElementById('generate-button')) {
            console.stdlog = console.log.bind(console);
            console.logs = [];
            console.log = function (msg) {
                /* 'current: true' is logged when download checkbox is clicked, ignore it*/
                if (!JSON.stringify(msg).includes('current:')) {
                    console.logs.push(Array.from(arguments));
                    console.stdlog.apply(console, arguments);
                }
            };


            const pollForElement = (elem, timeout, callback) => {
                const intervalPoll = setInterval(() => {
                    const element = document.querySelector(elem);
                    if (element) {
                        clearInterval(intervalPoll);
                        callback();
                    };
                }, pollInterval);
                setTimeout(() => clearInterval(intervalPoll), timeout);
            };

            /* https://stackoverflow.com/questions/33855641/copy-output-of-a-javascript-variable-to-the-clipboard */
            const copyToClipboard = (text) => {
                const dummy = document.createElement('textarea');
                document.body.appendChild(dummy);
                dummy.value = text;
                dummy.select();
                document.execCommand('copy');
                document.body.removeChild(dummy);
            };

            /* https://stackoverflow.com/questions/19721439/download-json-object-as-a-file-from-browser */
            const downloadFile = (text) => {
                if (document.getElementById('download-checkbox').checked) {
                    const dataStr = 'data:text/json;charset=utf-8,' + encodeURIComponent(text);
                    const downloadAnchorNode = document.createElement('a');
                    downloadAnchorNode.setAttribute('href', dataStr);
                    downloadAnchorNode.setAttribute('download', 'download.json');
                    document.body.appendChild(downloadAnchorNode);
                    downloadAnchorNode.click();
                    downloadAnchorNode.remove();
                }
            };

            const onClick = () => {
                if (!document.body.classList.contains('loading')) {
                    console.logs = [];
                    document.getElementById('submit-button').click();

                    pollForElement('.summary', 3000, () => {
                        setTimeout(() => {
                            const queryLog = console.logs[1];
                            const resultLog = console.logs[2];
                            console.logs = [];
                            const query = queryLog[0];
                            const result = resultLog && resultLog[1];

                            let obj;

                            if (result) {
                                obj = {
                                    title: 'generated by https://github.com/ianmah/310-bookmarklet. Pls gib star',
                                    query,
                                    isQueryValid: true,
                                    ...result
                                }
                            } else {
                                const errorMessages = document.getElementsByClassName('error-message');
                                const errorMessage = errorMessages.length && errorMessages[0].textContent.trim().replace('Unexpected response status 400: ', '');

                                /* In the case that the button was spammed, there will be no result and no error message, do nothing.
                                    There should already be a valid test case in the clipboard by then */
                                if (errorMessage) {
                                    const errorType = (errorMessage.includes('The result is too big. Only queries with a maximum of 5000 results are supported.')) ? 'ResultTooLargeError' : 'InsightError';
                                    obj = {
                                        title: `${errorMessage}. Generated by https://github.com/ianmah/310-bookmarklet. Pls gib star`,
                                        query,
                                        isQueryValid: false,
                                        result: errorType
                                    };
                                }

                            }

                            /* Do nothing if there is no object */
                            const stringifiedObj = JSON.stringify(obj, null, defaultIndentation);
                            if (obj) {
                                copyToClipboard(stringifiedObj);
                                downloadFile(stringifiedObj);
                            };
                            console.logs = [];
                        }, resultWaitTime);
                    });
                };
            };

            const parent = document.getElementById('submit-container');
            const button = document.createElement('a');
            const lineBreak = document.createElement('br');
            const downloadCheckboxLabel = document.createElement('span');
            const downloadCheckbox = document.createElement('input');
            downloadCheckboxLabel.innerHTML = 'Download Test File';

            button.innerHTML = 'Copy Test File';
            button.id = 'generate-button';
            button.className = 'btn';
            button.href = '#!';
            button.onclick = onClick;

            downloadCheckbox.type = 'checkbox';
            downloadCheckbox.id = 'download-checkbox';

            parent.appendChild(button);
            parent.appendChild(lineBreak);
            parent.appendChild(downloadCheckboxLabel);
            parent.appendChild(downloadCheckbox);
        }
    }
)();