(function (root, factory) {
  if (typeof module === 'object' && module.exports) module.exports = factory;
  else root.createInstallApp = factory;
})(typeof self !== 'undefined' ? self : this, function createInstallApp(options) {
  const dismissedKey = 'stackchain.install.dismissed.v1';
  let deferredPrompt = options.initialPrompt || null;
  let installed = false;

  function hide() {
    options.card.hidden = true;
  }

  function showNativePrompt(event) {
    event.preventDefault();
    deferredPrompt = event;
    options.guidance.hidden = true;
    options.installButton.hidden = false;
    options.card.hidden = false;
  }

  async function install() {
    if (!deferredPrompt) return;
    const prompt = deferredPrompt;
    deferredPrompt = null;
    options.installButton.disabled = true;
    await prompt.prompt();
    const choice = await prompt.userChoice;
    if (choice.outcome === 'accepted') {
      installed = true;
      hide();
      options.status.textContent = 'Stackchain was added to your device.';
    } else {
      hide();
      options.installButton.disabled = false;
      options.status.textContent = 'Installation was not completed.';
    }
  }

  function dismiss() {
    options.storage.setItem(dismissedKey, '1');
    hide();
  }

  function start() {
    if (options.isStandalone() || options.storage.getItem(dismissedKey) === '1') {
      hide();
      return;
    }
    if (deferredPrompt) showNativePrompt(deferredPrompt);
    if (options.isIosSafari()) {
      options.installButton.hidden = true;
      options.guidance.hidden = false;
      options.card.hidden = false;
    }
    options.window.addEventListener('beforeinstallprompt', showNativePrompt);
    options.window.addEventListener('appinstalled', () => {
      installed = true;
      deferredPrompt = null;
      hide();
    });
    options.installButton.addEventListener('click', install);
    options.dismissButton.addEventListener('click', dismiss);
  }

  function state() {
    if (installed || options.isStandalone()) {
      return {state:'complete', detail:'Stackchain is installed on this device.'};
    }
    if (options.isIosSafari()) {
      return {state:'incomplete', detail:'On Safari, tap Share, then Add to Home Screen.'};
    }
    if (deferredPrompt) {
      return {state:'incomplete', detail:'Stackchain is ready to install.'};
    }
    return {state:'unavailable', detail:'Installation is available from a supported browser.'};
  }

  return {start, install, state};
});
