/**
 * Generates a RawLink for the reverse shell generator. If the user hasn't changed
 * the default generated shell command, the generated URL will contain the original
 * parameters to generate the required command on demand.
 *
 * Otherwise a unique URL is created which inlined the current user provided command.
 */
const RawLink = {
    generate: (rsg) => {
        const commandSelector = rsg.uiElements[rsg.commandType].command;
        const currentCommandElement = document.querySelector(commandSelector);
        const defaultGeneratedCommand = rsg.generateReverseShellCommand();
        const isUserProvidedCommand = currentCommandElement.innerHTML != RawLink.escapeHTML(defaultGeneratedCommand);

        if (isUserProvidedCommand) {
            return RawLink.withCustomValue(currentCommandElement.innerText)

        }
        return RawLink.withDefaultPayload(rsg);
    },

    escapeHTML(html) {
        var element = document.createElement('div');
        element.innerHTML = html;
        return element.innerHTML;
    },

    withDefaultPayload: (rsg) => {
        const name = rsg.selectedValues[rsg.commandType];
        const queryParams = new URLSearchParams();
        queryParams.set('ip', rsg.getIP());
        queryParams.set('port', rsg.getPort());
        queryParams.set('shell', rsg.getShell());
        queryParams.set('encoding', rsg.getShell());

        return `/${encodeURIComponent(name)}?${queryParams}`
    },

    withCustomValue: (value) => {
        const queryParams = new URLSearchParams();
        queryParams.set('value', value)
        return `/raw?${queryParams}`
    }
}