// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for details.

/**
 * Logging utility class.
 */
import * as path from "path";
import * as mkdirp from "mkdirp";

export enum LogLevel {
    None = 0,
    Trace = 1,
    Debug = 2,
    Info = 3,
    Warning = 4,
    Error = 5,
    Verbose = 6,
    Custom = 7,
}

export interface ILogger {
    log: (message: string, level: LogLevel) => void;
    info: (message: string) => void;
    warning: (message: string) => void;
    error: (errorMessage: string, error?: Error, stack?: boolean) => void;
    debug: (message: string) => void;
    logStream: (data: Buffer | string, stream?: NodeJS.WritableStream) => void;
}

export class LogHelper {
    public static get LOG_LEVEL(): LogLevel {
        return getLogLevel();
    }
}

export interface DevLogToFileSettings {
    LogsDirectory: string | undefined;
}

export function getLoggingOptions(): DevLogToFileSettings {
    return {
        LogsDirectory: process.env.REACT_NATIVE_TOOLS_LOGS_DIR,
    };
}
/**
 * Returns directory in which the extension's log files will be saved
 * if `env` variables `REACT_NATIVE_TOOLS_LOGS_DIR` is defined.
 * Also, checks that path is a correct absolute path. Creates new folder if not exists yet.
 * @returns Path to the logs folder or null
 */
export function getLoggingDirectory(): string | null {
    const loggingOptions = getLoggingOptions();
    if (loggingOptions.LogsDirectory) {
        const dirPath = loggingOptions.LogsDirectory;
        if (!path.isAbsolute(dirPath)) {
            return null;
        }
        mkdirp.sync(dirPath);
        return dirPath;
    }
    return null;
}

function getLogLevel() {
    try {
        // eslint-disable-next-line @typescript-eslint/no-var-requires
        const SettingsHelper = require("../settingsHelper").SettingsHelper;
        return SettingsHelper.getLogLevel();
    } catch (err) {
        // Debugger context
        return LogLevel.Info; // Default
    }
}
