import { get as getFromConfig } from 'config';
import { BrowserWindow } from 'electron';
import { start as startUpdater, stop as stopUpdater } from './updater';
import { LoggerType, MessagesType } from './common';
import { UserConfig } from '../../app/user_config';

let initialized = false;
let config: UserConfig;

export async function start(
  getMainWindow: () => BrowserWindow,
  userConfig: UserConfig,
  messages?: MessagesType,
  logger?: LoggerType
) {
  if (initialized) {
    throw new Error('updater/start: Updates have already been initialized!');
  }
  initialized = true;
  config = userConfig;

  if (!messages) {
    throw new Error('updater/start: Must provide messages!');
  }
  if (!logger) {
    throw new Error('updater/start: Must provide logger!');
  }

  if (autoUpdateDisabled()) {
    /*
      If you really want to enable auto-updating in dev mode
      You need to create a dev-app-update.yml file.
      A sample can be found in dev-app-update.yml.sample.
      After that you can change `updatesEnabled` to `true` in the default config.
    */

    logger.info('updater/start: Updates disabled - not starting new version checks');

    return;
  }

  await startUpdater(getMainWindow, messages, logger);
}

export function stop() {
  if (initialized) {
    stopUpdater();
    initialized = false;
  }
}

function autoUpdateDisabled() {
  // We need to ensure that if auto update is not present in the user config then we assume it is on by default
  const userSetting = config.get('autoUpdate');
  const autoUpdate = typeof userSetting !== 'boolean' || userSetting;

  return (
    process.mas || // From Electron: Mac App Store build
    !getFromConfig('updatesEnabled') || // Hard coded config
    // tslint:disable-next-line: no-backbone-get-set-outside-model
    !autoUpdate // User setting
  );
}
