/**
 * @module modules/alogin-sk
 * @description <h2><code>alogin-sk</code></h2>
 *
 * Handles logging into applications that use alogin.Login.
 *
 * @attr {boolean} testing_offline - If we should really fetch Login status or
 *  use mock data.
 *
 * @attr {string} url - The url that returns the JSON serialized alogin.Status response.
 */
import { define } from 'elements-sk/define';
import { errorMessage } from 'elements-sk/errorMessage';
import { html } from 'lit-html';
import { ElementSk } from '../ElementSk';
import { alogin } from '../json';

const defaultStatusURL = '/_/login/status';

/**
 * Returns a Promise that resolves when we have received the login status, and
 * rejects if there was an error retrieving the login status.
 */
const loggedIn = async (url: string = defaultStatusURL): Promise<alogin.Status> => {
  const resp = await fetch(url);
  if (!resp.ok) {
    await errorMessage(`Failed to load login status: ${resp.statusText}`);
    return defaultStatus;
  }
  return resp.json();
};

const defaultStatus: alogin.Status = {
  email: '',
  login: '',
  logout: '',
};

const fakeStatus: alogin.Status = {
  email: 'test@example.com',
  login: '/login/',
  logout: '/logout/',
};

export class AloginSk extends ElementSk {
  /**
   * A promise that resolves to the users logged in status.
   *
   * The value of this may be altered by the 'testing_offline' attribute.
   */
  statusPromise: Promise<alogin.Status> = Promise.resolve(defaultStatus);

  private status: alogin.Status = defaultStatus;

  constructor() {
    super(AloginSk.template);
  }

  private static template = (ele: AloginSk) => html`
  <span class=email>
    ${ele.status.email}
  </span>
  <a
    class=logInOut
    href="${ele.status.email ? ele.status.logout : ele.status.login}"
  >
    ${ele.status.email ? 'Logout' : 'Login'}
  </a>
  `;

  async connectedCallback(): Promise<void> {
    super.connectedCallback();

    if (this.hasAttribute('testing_offline')) {
      this.statusPromise = Promise.resolve(fakeStatus);
      this.status = fakeStatus;
      this._render();
      return;
    }
    this.statusPromise = loggedIn(this.getAttribute('url') || undefined);
    this.status = await this.statusPromise;
    this._render();
  }
}

define('alogin-sk', AloginSk);
