"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.InitializeService = void 0;
const os_1 = require("os");
const _ = require("lodash");
const constants_1 = require("../constants");
const yok_1 = require("../common/yok");
class InitializeService {
    constructor($injector) {
        this.$injector = $injector;
    }
    initialize(initOpts) {
        return __awaiter(this, void 0, void 0, function* () {
            initOpts = initOpts || {};
            const $logger = this.$injector.resolve("logger");
            const $options = this.$injector.resolve("options");
            if (initOpts.loggerOptions) {
                $logger.initialize(initOpts.loggerOptions);
            }
            else {
                const loggerLevel = $options.log &&
                    constants_1.LoggerLevel[$options.log.toUpperCase()];
                $logger.initializeCliLogger({ level: loggerLevel });
            }
            if (initOpts.settingsServiceOptions) {
                const $settingsService = this.$injector.resolve("settingsService");
                $settingsService.setSettings(initOpts.settingsServiceOptions);
            }
            if (initOpts.extensibilityOptions) {
                if (initOpts.extensibilityOptions.pathToExtensions) {
                    const $extensibilityService = this.$injector.resolve("extensibilityService");
                    $extensibilityService.pathToExtensions =
                        initOpts.extensibilityOptions.pathToExtensions;
                }
            }
            if ($options.json) {
                $logger.trace("Skipping system warnings for --json commands");
            }
            else {
                yield this.showWarnings($logger);
            }
        });
    }
    showWarnings($logger) {
        return __awaiter(this, void 0, void 0, function* () {
            const $sysInfo = yok_1.injector.resolve("sysInfo");
            const systemWarnings = yield $sysInfo.getSystemWarnings();
            _.each(systemWarnings, (systemWarning) => {
                const message = `${os_1.EOL}${systemWarning.message}${os_1.EOL}`;
                if (systemWarning.severity === "high") {
                    $logger.error(message);
                }
                else {
                    $logger.warn(message);
                }
            });
        });
    }
}
exports.InitializeService = InitializeService;
yok_1.injector.register("initializeService", InitializeService);
