/+
- Name: SisuDoc Spine, Doc Reform [a part of]
  - Description: documents, structuring, processing, publishing, search
    - static content generator

  - Author: Ralph Amissah
    [ralph.amissah@gmail.com]

  - Copyright: (C) 2015 - 2025 Ralph Amissah, All Rights Reserved.

  - License: AGPL 3 or later:

    Spine (SiSU), a framework for document structuring, publishing and
    search

    Copyright (C) Ralph Amissah

    This program is free software: you can redistribute it and/or modify it
    under the terms of the GNU AFERO General Public License as published by the
    Free Software Foundation, either version 3 of the License, or (at your
    option) any later version.

    This program is distributed in the hope that it will be useful, but WITHOUT
    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
    more details.

    You should have received a copy of the GNU General Public License along with
    this program. If not, see [https://www.gnu.org/licenses/].

    If you have Internet connection, the latest version of the AGPL should be
    available at these locations:
    [https://www.fsf.org/licensing/licenses/agpl.html]
    [https://www.gnu.org/licenses/agpl.html]

  - Spine (by Doc Reform, related to SiSU) uses standard:
    - docReform markup syntax
      - standard SiSU markup syntax with modified headers and minor modifications
    - docReform object numbering
      - standard SiSU object citation numbering & system

  - Homepages:
    [https://www.sisudoc.org]
    [https://www.doc-reform.org]

  - Git
    [https://git.sisudoc.org/]

+/
module sisudoc.meta.metadoc_show_summary;
@safe:
template spineMetaDocSummary() {
  void spineMetaDocSummary(D)(D doc) {
    auto doc_matters = doc.matters;
    import
      sisudoc.meta.defaults,
      sisudoc.meta.rgx;
    import
      std.array,
      std.digest.crc,
      std.digest.sha,
      std.exception,
      std.regex,
      std.stdio,
      std.string,
      std.typecons,
      std.uni,
      std.utf,
      std.conv : to;
    mixin InternalMarkup;
    auto markup = InlineMarkup();
    auto min_repeat_number = 66;
    auto char_repeat_number = (doc_matters.conf_make_meta.meta.title_full.length
      + doc_matters.conf_make_meta.meta.creator_author.length + 4);
    char_repeat_number = (char_repeat_number > min_repeat_number)
    ? char_repeat_number
    : min_repeat_number;
    if (doc_matters.opt.action.vox_gt1
    || doc_matters.opt.action.show_summary) {
      string[string] check = [
        "last_object_number" : "NA [debug \"checkdoc\" not run]",
        "last_object_number_body"  : "0",
        "last_object_number_book_index" : "0",
      ];
      foreach (k; doc_matters.has.keys_seq.seg) {
        foreach (obj; doc.abstraction[k]) {
          if (obj.metainfo.is_of_part != "empty") {
            if (!empty(obj.metainfo.object_number)) {
              if (k == "body") {
                check["last_object_number_body"] = obj.metainfo.object_number;
              }
              if (!(obj.metainfo.object_number.empty)) {
                check["last_object_number"] = obj.metainfo.object_number;
              }
            }
            if (k == "bookindex") {
              if (obj.metainfo.object_number_type == 2) {
                check["last_object_number_book_index"] = obj.metainfo.object_number_book_index;
              }
            }
          }
        }
      }
      writefln(
        "%s\n\"%s\", %s\n%s [%s]\n%s \n%s - %s [%s]\n%s\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%s",
        markup.repeat_character_by_number_provided("-", char_repeat_number),
        doc_matters.conf_make_meta.meta.title_full,
        doc_matters.conf_make_meta.meta.creator_author,
        doc_matters.src.filename,
        doc_matters.src.language,
        markup.repeat_character_by_number_provided("-", char_repeat_number),
        doc_matters.doc_digest.markup_doc.toHexString,
        doc_matters.src.filename,
        doc_matters.src.language,
        markup.repeat_character_by_number_provided("-", char_repeat_number),
        "- toc arr length:",
        to!int(doc.abstraction["toc"].length),
        "- doc.abstraction arr length:",
        to!int(doc.abstraction["body"].length),
        "  doc body last obj on.#:",
        to!int(check["last_object_number_body"]),
        "  - number of tables:",
        doc_matters.has.tables,
        "  - number of codeblocks:",
        doc_matters.has.codeblocks,
        "  - number of poems:",
        doc_matters.has.poems,
        "  - number of blocks:",
        doc_matters.has.blocks,
        "  - number of groups:",
        doc_matters.has.groups,
        "  - number of images:",
        doc_matters.has.images,
        "- endnotes length:",                                // subtract headings
        (doc.abstraction["endnotes"].length > 2)
        ? (to!int(doc.abstraction["endnotes"].length - 2))
        : 0,
        "- glossary length:",
        (doc.abstraction["glossary"].length > 1)
        ? (to!int(doc.abstraction["glossary"].length))
        : 0,
        "- biblio length:",
        (doc.abstraction["bibliography"].length > 1)
        ? (to!int(doc.abstraction["bibliography"].length))
        : 0,
        "- bookindex length:",
        (doc.abstraction["bookindex"].length > 1)
        ? (to!int(doc.abstraction["bookindex"].length))
        : 0,
        "  book idx last obj on.#:",
        to!int(check["last_object_number_book_index"]),
        "- blurb length:",
        (doc.abstraction["blurb"].length > 1)
        ? (to!int(doc.abstraction["blurb"].length))
        : 0,
        "* last obj on.#:",
        to!int(check["last_object_number"]),
        "number of segments:",
        (doc_matters.has.segnames_lv4.length > 1)
        ? (to!int(doc_matters.has.segnames_lv4.length))
        : 0,
        markup.repeat_character_by_number_provided("-", min_repeat_number),
      );
    }
  }
}