/**
 * Our lib for handling secrets
 */
const SecretKeeper = function () {

    /**
     * Callback taking the secret from the user and doing what we need with it.
     *
     * @callback actionWithSecret
     * @param {string} token secret data to be used.
     * @returns {void}
     */

    /**
     * Build a form that allows the user to input thier "secrets" like dataworld token and have the
     * password manager pick it up.
     * @param {string} serviceName The name the users sees to identify the secret. Should be somthing like "Oracle" or "dataworld"
     * @param {actionWithSecret} actionWithSecret function that is called with the given secret
     * @param {boolean} makeSecretInputLookLikePassword makes the input for the secret behave like a password type input
     * @param {HTMLElement} node The HTML node that this form will be appended to 
     * @returns {void}
     */
    async function buildForm(serviceName, label, actionWithSecret, node = document.body) {
        if (typeof actionWithSecret !== "function") {
            actionWithSecret = () => console.warn("No action taken with secret for service", serviceName)
        }
        const iframe = document.createElement("iframe")
        iframe.style = "display:none"
        iframe.src = "./?blank"

        // we need the iframe to be up an running before the user can submit 
        // the form data. We can do this using a promise.
        // TODO: put a spinner to let the user know we are working on it
        await new Promise((resolve) => {
            iframe.onload = resolve
            node.append(iframe)
        });

        // build the form that the user interacts with
        const userForm = document.createElement("form")
        userForm.onsubmit = (e) => e.preventDefault()
        userForm.append(function () {
            let userNameInput, tokenInput
            const container = document.createElement("div")
            container.className = "secret-form-container"
            container.append(
                label,
                (() => {
                    userNameInput = document.createElement("input")
                    userNameInput.style.display="none"
                    userNameInput.value = serviceName
                    userNameInput.disabled = true
                    userNameInput.autocomplete = 'username'
                    return userNameInput
                })(),
                (() => {
                    tokenInput = document.createElement("input")
                    tokenInput.autocomplete = "new-password"
                    tokenInput.type = "password"
                    return tokenInput
                })(),
                (() => {
                    const loginBtn = document.createElement("button")
                    loginBtn.style.marginLeft=".3rem"
                    loginBtn.append("Save")
                    loginBtn.onclick = function () {
                        // create the form in the iframe
                        const secretInput = document.createElement("input")
                        secretInput.type = "password"
                        secretInput.autocomplete = "new-password"
                        const serviceInput = document.createElement("input")
                        serviceInput.type = "text"
                        serviceInput.autocomplete = "username"
                        const iform = document.createElement("form")
                        iform.action = "./?blank"
                        iform.append(secretInput, serviceInput)
                        iframe.contentWindow.document.body.append(iform)

                        // putting the secret in the iframe and submitting it will (hopefully) cause the
                        // password manager to save the value so the user does not need to copy it later
                        const token = tokenInput.value
                        serviceInput.value = serviceName
                        secretInput.value = token
                        iform.submit()
                        iform.remove()
                        actionWithSecret(token)
                        loginBtn.innerHTML = "Saved"
                    }
                    return loginBtn
                })(),
            )
            return container
        }())
        node.append(userForm)
    }

    return {
        buildForm,
    }
}()
