// @ts-check

"use strict";

const { addErrorDetailIf } = require("../helpers");
const { flattenedLists } = require("./cache");

module.exports = {
  "names": [ "MD030", "list-marker-space" ],
  "description": "Spaces after list markers",
  "tags": [ "ol", "ul", "whitespace" ],
  "function": function MD030(params, onError) {
    const ulSingle = Number(params.config.ul_single || 1);
    const olSingle = Number(params.config.ol_single || 1);
    const ulMulti = Number(params.config.ul_multi || 1);
    const olMulti = Number(params.config.ol_multi || 1);
    for (const list of flattenedLists()) {
      const lineCount = list.lastLineIndex - list.open.map[0];
      const allSingle = lineCount === list.items.length;
      const expectedSpaces = list.unordered ?
        (allSingle ? ulSingle : ulMulti) :
        (allSingle ? olSingle : olMulti);
      for (const item of list.items) {
        const { line, lineNumber } = item;
        const match = /^[\s>]*\S+(\s*)/.exec(line);
        const [ { "length": matchLength }, { "length": actualSpaces } ] = match;
        if (matchLength < line.length) {
          let fixInfo = null;
          if (expectedSpaces !== actualSpaces) {
            fixInfo = {
              "editColumn": matchLength - actualSpaces + 1,
              "deleteCount": actualSpaces,
              "insertText": "".padEnd(expectedSpaces)
            };
          }
          addErrorDetailIf(
            onError,
            lineNumber,
            expectedSpaces,
            actualSpaces,
            null,
            null,
            [ 1, matchLength ],
            fixInfo
          );
        }
      }
    }
  }
};
