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

import 'chrome://crostini-upgrader/app.js';

import {BrowserProxy} from 'chrome://crostini-upgrader/browser_proxy.js';
import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.js';
import {flushTasks} from 'chrome://test/test_util.js';

class FakePageHandler extends TestBrowserProxy {
  constructor() {
    super([
      'backup', 'startPrechecks', 'upgrade', 'restore', 'cancel',
      'cancelBeforeStart', 'onPageClosed', 'launch'
    ]);
  }

  /** @override */
  backup() {
    this.methodCalled('backup');
  }

  /** @override */
  startPrechecks() {
    this.methodCalled('startPrechecks');
  }

  /** @override */
  upgrade() {
    this.methodCalled('upgrade');
  }

  /** @override */
  restore() {
    this.methodCalled('restore');
  }

  /** @override */
  cancel() {
    this.methodCalled('cancel');
  }

  /** @override */
  cancelBeforeStart() {
    this.methodCalled('cancelBeforeStart');
  }

  /** @override */
  onPageClosed() {
    this.methodCalled('onPageClosed');
  }

  /** @override */
  launch() {
    this.methodCalled('launch');
  }
}

class FakeBrowserProxy {
  constructor() {
    this.handler = new FakePageHandler();
    this.callbackRouter =
        new chromeos.crostiniUpgrader.mojom.PageCallbackRouter();
    /** @type {appManagement.mojom.PageRemote} */
    this.page = this.callbackRouter.$.bindNewPipeAndPassRemote();
  }
}

suite('<crostini-upgrader-app>', () => {
  let fakeBrowserProxy;
  let app;

  setup(async () => {
    fakeBrowserProxy = new FakeBrowserProxy();
    BrowserProxy.instance_ = fakeBrowserProxy;

    app = document.createElement('crostini-upgrader-app');
    PolymerTest.clearBody();
    document.body.appendChild(app);

    await flushTasks();
  });

  teardown(function() {
    app.remove();
  });

  const clickButton = async (button) => {
    assertFalse(button.hidden);
    assertFalse(button.disabled);
    button.click();
    await flushTasks();
  };

  const getActionButton = () => {
    return app.$$('.action-button');
  };

  const getCancelButton = () => {
    return app.$$('#cancel-button');
  };

  const clickAction = async () => {
    await clickButton(getActionButton());
  };

  const clickCancel = async () => {
    await clickButton(getCancelButton());
  };

  const getBackupProgressBar = () => {
    return app.$$('#backup-progress-bar');
  };

  const getUpgradeProgressBar = () => {
    return app.$$('#upgrade-progress-bar');
  };

  const getRestoreProgressBar = () => {
    return app.$$('#restore-progress-bar');
  };

  const getProgressMessage = () => {
    return app.$$('#progress-message');
  };

  const waitMillis = (millis) => {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve();
      }, millis);
    });
  };

  test('upgradeFlow', async () => {
    expectFalse(app.$$('#prompt-message').hidden);
    expectEquals(fakeBrowserProxy.handler.getCallCount('backup'), 0);

    // The page will not register that backup has started until the first
    // progress message.
    await clickAction();
    fakeBrowserProxy.page.onBackupProgress(0);
    await flushTasks();
    expectFalse(getProgressMessage().hidden);
    expectEquals(fakeBrowserProxy.handler.getCallCount('backup'), 1);
    expectTrue(getActionButton().hidden);
    expectTrue(getCancelButton().hidden);

    fakeBrowserProxy.page.onBackupProgress(50);
    await flushTasks();
    expectTrue(
        !!getProgressMessage().textContent, 'progress message should be set');
    expectFalse(getBackupProgressBar().hidden);
    expectEquals(app.$$('#backup-progress-bar > paper-progress').value, 50);

    fakeBrowserProxy.page.onBackupSucceeded();
    await flushTasks();
    expectEquals(fakeBrowserProxy.handler.getCallCount('upgrade'), 0);
    // The UI pauses for 2000 ms before continuing.
    await waitMillis(2010).then(flushTasks());
    fakeBrowserProxy.page.precheckStatus(
        chromeos.crostiniUpgrader.mojom.UpgradePrecheckStatus.OK);
    await flushTasks();

    expectEquals(fakeBrowserProxy.handler.getCallCount('upgrade'), 1);
    expectFalse(getUpgradeProgressBar().hidden);
    fakeBrowserProxy.page.onUpgradeProgress(['foo', 'bar']);
    fakeBrowserProxy.page.onUpgradeSucceeded();
    await flushTasks();

    expectEquals(fakeBrowserProxy.handler.getCallCount('onPageClosed'), 0);
    expectTrue(getRestoreProgressBar().hidden);

    await clickAction();
    expectEquals(fakeBrowserProxy.handler.getCallCount('launch'), 1);
    expectEquals(fakeBrowserProxy.handler.getCallCount('onPageClosed'), 1);
  });

  test('upgradeFlowFailureOffersRestore', async () => {
    expectFalse(app.$$('#prompt-message').hidden);
    expectEquals(fakeBrowserProxy.handler.getCallCount('backup'), 0);

    // The page will not register that backup has started until the first
    // progress message.
    await clickAction();
    fakeBrowserProxy.page.onBackupProgress(0);
    await flushTasks();
    expectFalse(getProgressMessage().hidden);
    expectEquals(fakeBrowserProxy.handler.getCallCount('backup'), 1);
    expectTrue(getActionButton().hidden);
    expectTrue(getCancelButton().hidden);

    fakeBrowserProxy.page.onBackupSucceeded();
    await flushTasks();
    expectEquals(fakeBrowserProxy.handler.getCallCount('upgrade'), 0);
    // The UI pauses for 2000 ms before continuing.
    await waitMillis(2010).then(flushTasks());

    const kMaxUpgradeAttempts = 3;
    for (let i = 0; i < kMaxUpgradeAttempts; i++) {
      fakeBrowserProxy.page.precheckStatus(
          chromeos.crostiniUpgrader.mojom.UpgradePrecheckStatus.OK);
      await flushTasks();
      expectEquals(fakeBrowserProxy.handler.getCallCount('upgrade'), i + 1);
      expectFalse(getUpgradeProgressBar().hidden);
      fakeBrowserProxy.page.onUpgradeProgress(['foo', 'bar']);
      fakeBrowserProxy.page.onUpgradeFailed();
      await flushTasks();
    }

    expectEquals(fakeBrowserProxy.handler.getCallCount('restore'), 0);
    await clickAction();
    expectEquals(fakeBrowserProxy.handler.getCallCount('restore'), 1);
    fakeBrowserProxy.page.onRestoreProgress(50);
    await flushTasks();
    expectTrue(
        !!getProgressMessage().textContent, 'progress message should be set');
    expectFalse(getRestoreProgressBar().hidden);
    expectEquals(app.$$('#restore-progress-bar > paper-progress').value, 50);
    fakeBrowserProxy.page.onRestoreSucceeded();
    await flushTasks();

    await clickCancel();
    expectEquals(fakeBrowserProxy.handler.getCallCount('launch'), 1);
    expectEquals(fakeBrowserProxy.handler.getCallCount('onPageClosed'), 1);
  });
});
