"use strict";
var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
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());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (g && (g = 0, op[0] && (_ = 0)), _) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var __rest = (this && this.__rest) || function (s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                t[p[i]] = s[p[i]];
        }
    return t;
};
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.cli = void 0;
var lit_analyzer_config_js_1 = require("../analyze/lit-analyzer-config.js");
var analyze_command_js_1 = require("./analyze-command.js");
var parse_cli_arguments_js_1 = require("./parse-cli-arguments.js");
var util_js_1 = require("./util.js");
var DEFAULT_GLOB = "src/**/*.{js,jsx,ts,tsx}";
var DEFAULT_CONFIG = {
    noColor: false,
    quiet: false,
    maxWarnings: -1,
    //debug: false,
    help: false,
    failFast: false,
    format: "code",
    //strict: false,
    rules: {}
};
/**
 * The main function of the cli.
 */
function cli() {
    return __awaiter(this, void 0, void 0, function () {
        var _a, args, rest, globs, config, success;
        return __generator(this, function (_b) {
            switch (_b.label) {
                case 0:
                    _a = (0, parse_cli_arguments_js_1.parseCliArguments)(process.argv.slice(2)), args = _a._, rest = __rest(_a, ["_"]);
                    globs = args.length > 0 ? args : [DEFAULT_GLOB];
                    config = __assign(__assign({}, DEFAULT_CONFIG), rest);
                    if (config.debug) {
                        // eslint-disable-next-line no-console
                        console.log("CLI Config", config);
                    }
                    // Always convert "rules" to "dash case" because "rules" expects it.
                    config.rules = Object.entries(config.rules || {}).reduce(function (acc, _a) {
                        var _b = __read(_a, 2), k = _b[0], v = _b[1];
                        acc[(0, util_js_1.camelToDashCase)(k)] = v;
                        return acc;
                    }, {});
                    if (config.help) {
                        // eslint-disable-next-line no-console
                        console.log("\n\n  Usage\n    lit-analyzer [<file|directory|glob>]\n    \n  Options\n    --help                Print this message.\n    --format FORMAT       Specify output format. The possible options are:\n                            o code                Highlight problems in the code (default)\n                            o list                Short and precise list of problems\n                            o markdown            Markdown format\n    --noColor             Print results without color\n    --outFile FILE        Emit all output to a single file\n    --maxWarnings NUMBER  Fail only when the number of warnings is larger than this number\n    --quiet               Report only errors and not warnings\n    --failFast            Exit the process right after the first problem has been found\n    --strict              Enable strict mode. This change the default ruleset.\n    --rules.___ SEVERITY  Enable or disable a rule (example: --rules.no-unknown-tag-name off). \n                          Severity can be: \"off\" | \"warn\" | \"error\". The possible rules are:\n                          ".concat(lit_analyzer_config_js_1.ALL_RULE_IDS.map(function (ruleName) { return "o  ".concat(ruleName); }).join("\n                          "), "\n    \n  Examples\n    lit-analyzer src\n    lit-analyzer \"src/**/*.{js,ts}\"\n    lit-analyzer my-element.js\n\t\t"));
                        return [2 /*return*/];
                    }
                    return [4 /*yield*/, (0, analyze_command_js_1.analyzeCommand)(globs, config)];
                case 1:
                    success = _b.sent();
                    process.exit(success ? 0 : 1);
                    return [2 /*return*/];
            }
        });
    });
}
exports.cli = cli;
