"use strict";
/*
 * @poppinss/cliui
 *
 * (c) Harminder Virk <virk@adonisjs.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.instantiate = void 0;
const color_support_1 = __importDefault(require("color-support"));
const Icons_1 = require("./src/Icons");
const Table_1 = require("./src/Table");
const Logger_1 = require("./src/Logger");
const Manager_1 = require("./src/Task/Manager");
const Instructions_1 = require("./src/Instructions");
const Memory_1 = require("./src/Renderer/Memory");
const Console_1 = require("./src/Renderer/Console");
function instantiate(testing) {
    /**
     * Is terminal interactive or not. The code is copied from
     * https://github.com/sindresorhus/is-interactive/blob/master/index.js.
     *
     * Yes, we can install it as a dependency, but decided to copy/paste 4
     * lines. NO STRONG REASONS BEHIND IT
     */
    const isInteractive = Boolean(process.stdout && process.stdout.isTTY && process.env.TERM !== 'dumb' && !('CI' in process.env));
    /**
     * Whether or not colors are enabled. They are enabled by default,
     * unless the terminal doesn't support color. Also "FORCE_COLOR"
     * env variable enables them forcefully.
     */
    const supportsColors = !!process.env.FORCE_COLOR || color_support_1.default.level > 0;
    /**
     * The renderer used in the testing mode. One can access it to listen
     * for the log messages. Also, the memory renderer only works when
     * the "CLI_UI_IS_TESTING" flag is set
     */
    const testingRenderer = new Memory_1.MemoryRenderer();
    /**
     * Console renderer outputs to the console. We do not export it, since one
     * cannot do much by having an access to it.
     */
    const consoleRenderer = new Console_1.ConsoleRenderer();
    /**
     * Logger
     */
    const logger = new Logger_1.Logger({ colors: supportsColors, interactive: isInteractive }, testing);
    logger.useRenderer(testing ? testingRenderer : consoleRenderer);
    /**
     * Reference to the instructions block to render a set of lines inside
     * a box.
     */
    const instructions = () => {
        const instructionsInstance = new Instructions_1.Instructions({ colors: supportsColors, icons: true }, testing);
        instructionsInstance.useRenderer(testing ? testingRenderer : consoleRenderer);
        return instructionsInstance;
    };
    /**
     * Similar to instructions. But the lines are not prefix with a pointer `>`
     */
    const sticker = () => {
        const stickerInstance = new Instructions_1.Instructions({ colors: supportsColors, icons: false }, testing);
        stickerInstance.useRenderer(testing ? testingRenderer : consoleRenderer);
        return stickerInstance;
    };
    /**
     * Initiates a group of tasks
     */
    const tasks = () => {
        const manager = new Manager_1.TaskManager({ colors: supportsColors, interactive: isInteractive }, testing);
        manager.useRenderer(testing ? testingRenderer : consoleRenderer);
        return manager;
    };
    /**
     * Initiate tasks in verbose mode
     */
    tasks.verbose = () => {
        const manager = new Manager_1.TaskManager({ colors: supportsColors, interactive: isInteractive, verbose: true }, testing);
        manager.useRenderer(testing ? testingRenderer : consoleRenderer);
        return manager;
    };
    /**
     * Instantiate a new table
     */
    const table = () => {
        const tableInstance = new Table_1.Table({ colors: supportsColors }, testing);
        tableInstance.useRenderer(testing ? testingRenderer : consoleRenderer);
        return tableInstance;
    };
    return {
        table,
        tasks,
        icons: Icons_1.icons,
        logger,
        sticker,
        instructions,
        isInteractive,
        supportsColors,
        consoleRenderer,
        testingRenderer,
    };
}
exports.instantiate = instantiate;
