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

/* eslint-env es6 */

"use strict";

const fs = require("fs");
const yaml = require("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;
}

/*
 * The next couple of functions are just used to transform the changelog YAML configuration
 * structure into one accepted by the Conventional Changelog adapter (conventional-changelog-tf-a).
 */

function getTypes(sections) {
    return sections.map(section => {
        return {
            "type": section.type,
            "section": section.hidden ? undefined : section.title,
            "hidden": section.hidden || false,
        };
    })
}

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

        return {
            "title": subsection.title,
            "sections": getSections(subsection.subsections || []),
            "scopes": scope.concat(subsection.deprecated || []),
        };
    })
};

const types = getTypes(changelog.sections);
const sections = getSections(changelog.subsections);

module.exports = {
    "header": "# Change Log & Release Notes\n\nThis document contains a summary of the new features, changes, fixes and known\nissues in each release of Trusted Firmware-A.\n",
    "preset": {
        "name": "tf-a",
        "commitUrlFormat": "https://review.trustedfirmware.org/plugins/gitiles/TF-A/trusted-firmware-a/+/{{hash}}",
        "compareUrlFormat": "https://review.trustedfirmware.org/plugins/gitiles/TF-A/trusted-firmware-a/+/refs/tags/{{previousTag}}..refs/tags/{{currentTag}}",
        "userUrlFormat": "https://github.com/{{user}}",

        "types": types,
        "sections": sections,
    },
    "infile": "docs/change-log.md",
    "skip": {
        "commit": true,
        "tag": true
    },
    "bumpFiles": [
        {
            "filename": "package.json",
            "type": "json"
        },
        {
            "filename": "pyproject.toml",
            "updater": {
                "readVersion": function (contents) {
                    const _ver = contents.match(/version\s=.*"(\d)\.(\d)\.(\d)/);

                    return `${_ver[1]}.${_ver[2]}.${_ver[2]}`;
                },

                "writeVersion": function (contents, version) {
                    const _ver = 'version = "' + version + '"'

                    return contents.replace(/^(version\s=\s")((\d).?)*$/m, _ver)
                }

            },
        },
        {
            "filename": "package-lock.json",
            "type": "json"
        },
        {
            "filename": "tools/conventional-changelog-tf-a/package.json",
            "type": "json"
        },
        {
            "filename": "Makefile",
            "updater": {
                "readVersion": function (contents) {
                    const major = contents.match(/^VERSION_MAJOR\s*:=\s*(\d+?)$/m)[1];
                    const minor = contents.match(/^VERSION_MINOR\s*:=\s*(\d+?)$/m)[1];

                    return `${major}.${minor}.0`;
                },

                "writeVersion": function (contents, version) {
                    const major = version.split(".")[0];
                    const minor = version.split(".")[1];

                    contents = contents.replace(/^(VERSION_MAJOR\s*:=\s*)(\d+?)$/m, `$1${major}`);
                    contents = contents.replace(/^(VERSION_MINOR\s*:=\s*)(\d+?)$/m, `$1${minor}`);

                    return contents;
                }
            }
        }
    ]
};
