'use strict';

function accounts_list_item_deleted(account) {
    const account_item = document.getElementById(`${account.provider_name}-${account.user_name}`);
    if (account_item)
        account_item.parentNode.removeChild(account_item);
    else
        console.log(`accounts_list_item_deleted: List item for ${account.provider_name}-${account.user_name} not found.`);
}

function accounts_list_delete(account) {
    if (!confirm(`Are you sure you want to delete account ${account.user_name} at ${account.provider_name}?`))
        return;
    const lambdaApi = api_url(`/external-accounts/${account.provider_name}/${account.user_name}`);
    console.log(`accounts_list_delete: Deleting account ${lambdaApi.href}`);
    accounts_list_item_deleting(account, true);
    fetch(lambdaApi, {
        method: "DELETE",
        headers: {"Authorization": `Bearer ${access_token}`}
    })
        .then(() => {
                console.log(`accounts_list_delete: Deleted ${lambdaApi.href}`);
                accounts_list_item_deleted(account);
            },
            (reason) => {
                console.log(`accounts_list_delete: Delete ${lambdaApi.href} failed: ${reason}`);
                accounts_list_item_deleting(account, false);
            });
}

function accounts_list_error(reason) {
    const accounts_list = document.getElementById("AccountsList");
    accounts_list.appendChild(e("LI", {"class": "list-group-item error"}, t(`Error: ${reason}`)));
}

function accounts_list_loading() {
    const accounts_list = document.getElementById("AccountsList");
    accounts_list.appendChild(e("LI", {"class": "list-group-item"}, t("Loading...")));
}

function accounts_list_fetch() {
    const lambdaApi = api_url("/external-accounts");
    console.log(`accounts_list_fetch: Fetching accounts from ${lambdaApi.href}`);
    fetch(lambdaApi.href, {
        method: "GET",
        headers: {"Authorization": "Bearer " + access_token}
    })
        .then(res => res.json(),
            reason => {
                console.log(`accounts_list_fetch: Request failed: ${reason}`);
                accounts_list_clear();
                accounts_list_error(reason);
            })
        .then(result => {
            console.log(`accounts_list_fetch: Fetch accounts succeeded, returns ${result.length} accounts`);
            accounts_list_clear();
            if (result)
                accounts_list_show(result);
            else
                accounts_list_empty();
        }, reason => {
            console.log(`accounts_list_fetch: Parsing response failed: ${reason}`);
            accounts_list_clear();
            accounts_list_error(reason);
        });
    accounts_list_clear();
    accounts_list_loading();
}


function accounts_list_show(external_accounts) {
    const accounts_list = document.getElementById("AccountsList");

    for (const account of external_accounts) {
        const li = e("LI",
            {
                "id": account.id,
                "class": "list-group-item account"
            },
            t(`${account.provider_name}: ${account.user_name}`),
            e("INPUT", {
                "id": `delete-${account.provider_name}-${account.user_name}`,
                type: "button",
                value: "Delete",
                "class": "btn",
                onclick: () => {
                    accounts_list_delete(account)
                }
            }),
        );
        accounts_list.appendChild(li);
    }
}

function accounts_list_empty() {
    const accounts_list = document.getElementById("AccountsList");
    accounts_list.appendChild(e("LI", {"class": "list-group-item"},
        t("No accounts")));
}

function accounts_list_clear() {
    const accounts_list = document.getElementById("AccountsList");
    while (accounts_list.firstChild)
        accounts_list.firstChild.remove();
}
