/*
 * Copyright (c) 2021-2024, Arm Limited. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

/* eslint-env es6 */

"use strict";

import fs from "fs";
import rules from "@commitlint/rules";
import yaml from "js-yaml";

/*
 * The types and scopes accepted by both Commitlint and Commitizen are defined by the changelog
 * configuration file - `changelog.yaml` - as they decide which section of the changelog commits
 * with a given type and scope are placed in.
 */

let changelog;

try {
    const contents = fs.readFileSync("changelog.yaml", "utf8");

    changelog = yaml.load(contents);
} catch (err) {
    console.log(err);

    throw err;
}

function getTypes(sections) {
    return sections.map(section => section.type)
}

function getScopes(subsections) {
    return subsections.flatMap(subsection => {
        const scope = subsection.scope ? [subsection.scope] : [];
        const subscopes = getScopes(subsection.subsections || []);

        return scope.concat(subscopes);
    })
};

const types = getTypes(changelog.sections).sort(); /* Sort alphabetically */
const scopes = getScopes(changelog.subsections).sort(); /* Sort alphabetically */

export default {
    extends: ["@commitlint/config-conventional"],
    plugins: [
        {
            rules: {
                "signed-off-by-exists": rules["trailer-exists"],
                "change-id-exists": rules["trailer-exists"],
            },
        },
    ],
    rules: {
        "header-max-length": [1, "always", 50], /* Warning */
        "body-max-line-length": [1, "always", 72], /* Warning */

        "change-id-exists": [1, "always", "Change-Id:"], /* Warning */
        "signed-off-by-exists": [1, "always", "Signed-off-by:"], /* Warning */

        "type-case": [2, "always", "lower-case"], /* Error */
        "type-enum": [2, "always", types], /* Error */

        "scope-case": [2, "always", "lower-case"], /* Error */
        "scope-enum": [1, "always", scopes] /* Warning */
    },
};
