/+
- 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 - 2024 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/]

+/
/++
  output debugs
+/
module sisudoc.meta.doc_debugs;
template spineDebugs() {
  import
    sisudoc.meta.defaults,
    sisudoc.meta.rgx_files;
  import
    std.algorithm,
    std.array,
    std.container,
    std.exception,
    std.json,
    std.stdio,
    std.file,
    std.path,
    std.range,
    std.regex,
    std.string,
    std.typecons,
    std.utf,
    std.conv : to;
  auto spineDebugs(S,T)(
    const S  contents,
          T  doc_matters,
  ) {
    mixin spineRgxFiles;
    mixin InternalMarkup;
    static auto rgx_files = RgxFiles();
    auto markup = InlineMarkup();
    string key;
    debug(parent) {
      writefln(
        "%s:%s",
        __FILE__,
        __LINE__,
      );
      foreach (key; doc_matters.has.keys_seq.seg) {
        foreach (obj; contents[key]) {
          if (obj.metainfo.is_of_part != "empty") {
            if (obj.metainfo.is_a == "heading") {
              writefln(
                "%s node: %s heading: %s %s",
                obj.object_number,
                obj.node,
                obj.heading_lev_markup,
                obj.text,
              );
            }
          }
        }
      }
    }
    debug(checkdoc) {
      if ((doc_matters.opt.action.debug_do)) {
        debug(checkdoc) {
          if (auto mfn=match(doc_matters.src.filename, rgx_files.src_fn)) {
            if (doc_matters.opt.action.assertions) {
              switch (mfn.captures[2]) {
              // live manual:
              case "live-manual.ssm":
                assert(check["last_object_number"] ==
                  "1019","last object_number should be: 1019 (check test, document is frequently updated)"); // ok
                break;
              // sisu_markup:
              case "sisu_markup.sst":
                assert(check["last_object_number"] ==
                  "297","last object_number expected to be: 297 rather than " ~ check["last_object_number"]); // ok
                // assert(check["last_object_number"] == "297","last object_number expected to be: 297 rather than " ~ check["last_object_number"]);
                // notes for first divergance study sisu headings 247 250
                // sisu has issue with code that contains heading 1~ which results in no object_number! ??
                // sisu currently has incorrect last body object_number of 294!
                // bug in sisu? attend
                break;
              // sisu-markup-samples:
              case "accelerando.charles_stross.sst":
                assert(check["last_object_number"] ==
                  "2861","last object_number expected to be: 2861 rather than " ~ check["last_object_number"]); // ok
                break;
              case "alices_adventures_in_wonderland.lewis_carroll.sst":
                assert(check["last_object_number"] ==
                  "805","last object_number expected to be: 805 rather than " ~ check["last_object_number"]); // 808
                break;
              case "autonomy_markup0.sst":
                assert(check["last_object_number"] ==
                  "77","last object_number expected to be: 77 rather than " ~ check["last_object_number"]); // ok endnotes
                // assert(check["last_object_number"] == "78","last object_number expected to be: 78 rather than " ~ check["last_object_number"]);
                break;
              case "content.cory_doctorow.sst":
                assert(check["last_object_number"] ==
                  "953","last object_number expected to be: 953 rather than " ~ check["last_object_number"]); // 1007 way off, check object_number off switches
                // assert(check["last_object_number"] == "953","last object_number expected to be: 953 rather than " ~ check["last_object_number"]);
                break;
              case "democratizing_innovation.eric_von_hippel.sst":
                // fixed ERROR! range violation, broken check! endnotes, bookindex, biblio
                // error in bookindex ... (ch1; ch6; ch8 )
                assert(check["last_object_number"] ==
                  "905","last object_number expected to be: 905 rather than " ~ check["last_object_number"]); // 911
                break;
              case "down_and_out_in_the_magic_kingdom.cory_doctorow.sst":
                assert(check["last_object_number"] ==
                  "1417","last object_number expected to be: 1417 rather than " ~ check["last_object_number"]); // 1455 check object_number off switches
                break;
              case "for_the_win.cory_doctorow.sst":
                assert(check["last_object_number"] ==
                  "3510","last object_number expected to be: 3510 rather than " ~ check["last_object_number"]); // 3569 check object_number off switches
                break;
              case "free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.sst":
                assert(check["last_object_number"] ==
                  "1082","last object_number expected to be: 1082 rather than " ~ check["last_object_number"]); // check 1079 too few
                break;
              case "free_culture.lawrence_lessig.sst":
                assert(check["last_object_number"] ==
                  "1330","last object_number expected to be: 1330 rather than " ~ check["last_object_number"]); // 1312
                // fixed ERROR! range violation, broken check!
                // error in bookindex ... sections piracy (ch1) & property (ch10 market concentration) fixed
                break;
              case "free_for_all.peter_wayner.sst": // endnotes, bookindex, biblio
                assert(check["last_object_number"] ==
                  "1559","last object_number expected to be: 1559 rather than " ~ check["last_object_number"]); // 1560, check object_number off switches, has endnotes so 2 too many
                // assert(check["last_object_number"] == "1559","last object_number expected to be: 1559 rather than " ~ check["last_object_number"]);
                break;
              case "gpl2.fsf.sst":
                assert(check["last_object_number"] ==
                  "65","last object_number expected to be: 65 rather than " ~ check["last_object_number"]); // ok endnotes? check
                // assert(check["last_object_number"] == "66","last object_number expected to be: 66 rather than " ~ check["last_object_number"]);
                break;
              case "gpl3.fsf.sst":
                assert(check["last_object_number"] ==
                  "123","last object_number expected to be: 123 rather than " ~ check["last_object_number"]); // ok
                break;
              case "gullivers_travels.jonathan_swift.sst":
                assert(check["last_object_number"] ==
                  "668","last object_number expected to be: 668 rather than " ~ check["last_object_number"]); // 674
                break;
              case "little_brother.cory_doctorow.sst":
                assert(check["last_object_number"] ==
                  "3130","last object_number expected to be: 3130 rather than " ~ check["last_object_number"]); // 3204, check object_number off switches
                break;
              case "the_cathedral_and_the_bazaar.eric_s_raymond.sst":
                assert(check["last_object_number"] ==
                  "258","last object_number expected to be: 258 rather than " ~ check["last_object_number"]); // ok
                break;
              case "the_public_domain.james_boyle.sst":
                assert(check["last_object_number"] ==
                  "970","last object_number expected to be: 970 rather than " ~ check["last_object_number"]); // 978
                break;
              case "the_wealth_of_networks.yochai_benkler.sst": // endnotes, bookindex
                assert(check["last_object_number"] ==
                  "829","last object_number expected to be: 829 rather than " ~ check["last_object_number"]); // ok
                // assert(check["last_object_number"] == "832","last object_number expected to be: 832 rather than " ~ check["last_object_number"]);
                // has endnotes and bookindex, issue with sisu.rb
                break;
              case "through_the_looking_glass.lewis_carroll.sst":
                assert(check["last_object_number"] ==
                  "949","last object_number expected to be: 949 rather than " ~ check["last_object_number"]); // 955
                break;
              case "two_bits.christopher_kelty.sst": // endnotes, bookindex, biblio
                assert(check["last_object_number"] ==
                  "1190","last object_number expected to be: 1190 rather than " ~ check["last_object_number"]); // 1191
                // assert(check["last_object_number"] == "1193","last object_number expected to be: 1193 rather than " ~ check["last_object_number"]); // 1191 ok?
                // has endnotes and bookindex, issue with sisu.rb
                break;
                // fixed ERROR! range violation!
                // error in bookindex ... (ch3 the movement)
              case "un_contracts_international_sale_of_goods_convention_1980.sst":
                assert(check["last_object_number"] ==
                  "377","last object_number expected to be: 377 rather than " ~ check["last_object_number"]); // ok
                break;
              case "viral_spiral.david_bollier.sst": // endnotes, bookindex
                assert(check["last_object_number"] ==
                  "1078","last object_number expected to be: 1078 rather than " ~ check["last_object_number"]); // 1100
                // fixed ERROR! range violation!
                // error in bookindex ... (ch7 ... building the cc machine, an extra semi colon)
                break;
              default:
                writeln(doc_matters.src.filename);
                break;
              }
            }
          }
        }
        debug(checkdoc) {
          void out_segnames(S,T)(
            const S  contents,
                  T  doc_matters,
          ) {
            foreach (key; doc_matters.has.keys_seq.seg) {
              if (contents[key].length > 1) {
                foreach (obj; contents[key]) {
                  if (obj.heading_lev_markup == 4) {
                    writeln(obj.ptr_html_segnames, ". (", doc_matters.has.segnames_lv4[obj.ptr_html_segnames], ") -> ",  obj.text);
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}