// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

const parentSelect = document.getElementById('parent_to_invite');
const createButton = document.getElementById('create_linked_account_invite');
const acceptButtons = document.querySelectorAll('.incoming_invite');
const unlinkButtons = document.querySelectorAll('.unlink_account');

function CreateLinkedAccountInvite(ev) {
  const email = parentSelect.value;
  const message = {
    email: email,
  };
  const inviteCall = window.prpcClient.call(
    'monorail.Users', 'InviteLinkedParent', message);
  inviteCall.then((resp) => {
    location.reload();
  }).catch((reason) => {
    console.error('Inviting failed: ' + reason);
  });
}

function AcceptIncomingInvite(ev) {
  const email = ev.target.attributes['data-email'].value;
  const message = {
    email: email,
  };
  const acceptCall = window.prpcClient.call(
    'monorail.Users', 'AcceptLinkedChild', message);
  acceptCall.then((resp) => {
    location.reload();
  }).catch((reason) => {
    console.error('Accepting failed: ' + reason);
  });
}


function UnlinkAccounts(ev) {
  const parent = ev.target.dataset.parent;
  const child = ev.target.dataset.child;
  const message = {
    parent: {display_name: parent},
    child: {display_name: child},
  };
  const unlinkCall = window.prpcClient.call(
    'monorail.Users', 'UnlinkAccounts', message);
  unlinkCall.then((resp) => {
    location.reload();
  }).catch((reason) => {
    console.error('Unlinking failed: ' + reason);
  });
}


if (parentSelect) {
  parentSelect.onchange = function(e) {
    const email = parentSelect.value;
    createButton.disabled = email ? '' : 'disabled';
  };
}

if (createButton) {
  createButton.onclick = CreateLinkedAccountInvite;
}

if (acceptButtons) {
  for (const acceptButton of acceptButtons) {
    acceptButton.onclick = AcceptIncomingInvite;
  }
}

if (unlinkButtons) {
  for (const unlinkButton of unlinkButtons) {
    unlinkButton.onclick = UnlinkAccounts;
  }
}
