module doc_reform.meta.metadoc_harvests_topics;
  import
    std.algorithm,
    std.array,
    std.exception,
    std.regex,
    std.stdio,
    std.string,
    std.conv : to;
  import
    doc_reform.meta.defaults,
    doc_reform.meta.rgx;
  mixin DocReformHarvest;
  mixin InternalMarkup;
  mixin DocReformRgxInit;
template DocReformMetaDocHarvestsTopics() {
  auto mkup = InlineMarkup();
  void DocReformMetaDocHarvestsTopics(H,O)(
    H  hvst,
    O  _opt_action,
  ) {
      auto min_repeat_number = 42;
      string[] _document_topic_register;
      string[] _topic_register;
      string[] _sub_topic_register;
      string[] topics = [];
      string _auth = "";
      foreach(k, doc_harvest; hvst.harvests) {
        _topic_register = [];
        foreach(topic; doc_harvest.topic_register_arr.sort) {
          _sub_topic_register = [];
          string _spaces;
          string[] subject_tree = topic.split(mkup.sep);
          switch (subject_tree.length) {
          case 1:
            hvst.subject_trees[subject_tree[0]]["_a"]["_a"]["_a"] ~= doc_harvest;
            break;
          case 2:
            hvst.subject_trees[subject_tree[0]][subject_tree[1]]["_a"]["_a"] ~= doc_harvest;
            break;
          case 3:
            hvst.subject_trees[subject_tree[0]][subject_tree[1]][subject_tree[2]]["_a"] ~= doc_harvest;
            break;
          case 4:
            hvst.subject_trees[subject_tree[0]][subject_tree[1]][subject_tree[2]][subject_tree[3]] ~= doc_harvest;
            break;
          default:
            break;
          }
          _topic_register ~= _sub_topic_register.join("\n");
        }
        auto char_repeat_number = (doc_harvest.title.length
          + doc_harvest.author.length + 16);
        char_repeat_number = (char_repeat_number > min_repeat_number)
        ? char_repeat_number
        : min_repeat_number;
        _document_topic_register ~= format(
          "\"%s\", %s%s\n%s",
          doc_harvest.title,
          doc_harvest.author,
          (doc_harvest.date_published.length > 0) ? " (" ~ doc_harvest.date_published ~ ")" : "",
          _topic_register.sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable).release.join("\n"),
        );
      }
string theme_dark_0 = format(q"┃
  body {
    color: #CCCCCC;
    background: #000000;
    background-color: #000000;
  }
  a:link {
    color: #FFFFFF;
    text-decoration: none;
  }
  a:visited {
    color: #999999;
    text-decoration: none;
  }
  a:hover {
    color: #000000;
    background-color: #555555;
  }
  a:hover img {
    background-color: #000000;
  }
  a:active {
    color: #888888;
    text-decoration: underline;
  }
┃");
string theme_light_0 = format(q"┃
  body {
    color: black;
    background: #ffffff;
    background-color: #ffffff;
  }
  a:link {
    color: #003399;
    text-decoration: none;
  }
  a:visited {
    color: #003399;
    text-decoration: none;
  }
  a:hover {
    color: #000000;
    background-color: #f9f9aa;
  }
  a:hover img {
    background-color: #ffffff;
  }
  a:active {
    color: #003399;
    text-decoration: underline;
  }
┃");
string theme_dark_1 = format(q"┃
  h1 {
    color: white;
    background: #000000;
  }
  p.letter {
    color: white;
    background: #333333;
  }
  p.lev0 {
    color: white;
    background: #000000;
  }
  p.lev1 {
    color: white;
    background: #333333;
  }
  p.lev2 {
    background: #555555;
  }
  p.lev3 {
    background: #777777;
  }
  p.lev4 {
    background: #aaaaaa;
  }
  p.lev5 {
  }
┃");
string theme_light_1 = format(q"┃
  h1 {
    color: white;
    background: #000088;
  }
  p.letter {
    color: white;
    background: #880000;
  }
  p.lev0 {
    color: white;
    background: #000000;
  }
  p.lev1 {
    color: white;
    background: #444444;
  }
  p.lev2 {
    background: #888888;
  }
  p.lev3 {
    background: #bbbbbb;
  }
  p.lev4 {
    background: #eeeeee;
  }
  p.lev5 {
  }
┃");
      topics ~= format(q"┃<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Metadata Harvest - Topics</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="dc.title" content= "metadata harvest, Authors & Topics - information Structuring Universe, Structured information Serialised Units" />
<meta name="dc.subject" content= "document structuring, ebook, publishing, PDF, LaTeX, XML, ODF, SQL, postgresql, sqlite, electronic book, electronic publishing, electronic document, electronic citation, data structure, citation systems, granular search, digital library" />
<meta name="generator" content="doc_reform" />
<link rel="generator" href="http://sisudoc.org" />
<link href="../../_sisu/css/harvest.css" rel="stylesheet">
<style TYPE="text/css">
/* DocReform harvest css default stylesheet */%s
  .norm, .bold {
    line-height: 150%%;
    margin-left: 1em;
    margin-right: 2em;
    margin-top: 10px;
    margin-bottom: 0px;
    text-indent: 0mm;
  }
  p, h0, h1, h2, h3, h4, h5, h6, h7 {
    display: block;
    font-family: verdana, arial, georgia, tahoma, sans-serif, helvetica, times, roman;
    font-size: 100%%;
    font-weight: normal;
    line-height: 150%%;
    /* text-align: justify; */
    margin-left: 1em;
    text-indent: 0mm;
    margin-top: 2px;
    margin-bottom: 2px;
    margin-right: 6px;
    text-align: left;
  }
  h0, h1, h2, h3, h4, h5, h6, h7 { text-shadow: .2em .2em .3em #999999; }
  h1 {
    font-size: 120%%;
    font-weight: bold;
    color: white;
    background: #000088;
    margin-left: 0em;
  }
  p.work {
    font-size: 80%%;
    margin-left: 5em;
    margin-top: 0px;
    margin-bottom: 0px;
    margin-right: 6px;
    text-align: left;
  }
  p.author {
    font-size: 100%%;
    margin-left: 2em;
    margin-top: 0px;
    margin-bottom: 0px;
    margin-right: 6px;
    text-align: left;
  }
  p.publication {
    font-size: 80%%;
    margin-left: 4em;
    margin-top: 0px;
    margin-bottom: 0px;
    margin-right: 6px;
    text-align: left;
  }
  p.letter {
    font-weight: bold;
    font-size: 60%%;
    margin-left: 1em;
    margin-top: 0px;
    margin-bottom: 0px;
    margin-right: 6px;
    text-align: left;
  }
  p.lev0 {
    font-size: 120%%;
    margin-left: 1em;
  }
  p.lev1 {
    font-size: 110%%;
    margin-left: 2em;
  }
  p.lev2 {
    font-size: 100%%;
    margin-left: 3em;
  }
  p.lev3 {
    font-size: 90%%;
    margin-left: 4em;
  }
  p.lev4 {
    font-size: 80%%;
    margin-left: 5em;
  }
  p.lev5 {
    font-size: 80%%;
    margin-left: 6em;
  }%s
</style>
<link rel="shortcut icon" href="../_sisu/image/rb7.ico" />
</head>
<body lang="en" xml:lang="en">
<a name="top" id="top"></a>
<a name="up" id="up"></a>
<a name="start" id="start"></a>
<h1>Metadata Harvest - Topics (output organised by language &amp; filetype)</h1>
<p>[<a href="../../index.html">&nbsp;HOME&nbsp;</a>] also see <a href="authors.html">Metadata Harvest - Authors</a></p>
<p><a href="#A">A</a>,&nbsp;<a href="#B">B</a>,&nbsp;<a href="#C">C</a>,&nbsp;<a href="#D">D</a>,&nbsp;<a href="#E">E</a>,&nbsp;<a href="#F">F</a>,&nbsp;<a href="#G">G</a>,&nbsp;<a href="#H">H</a>,&nbsp;<a href="#I">I</a>,&nbsp;<a href="#J">J</a>,&nbsp;<a href="#K">K</a>,&nbsp;<a href="#L">L</a>,&nbsp;<a href="#M">M</a>,&nbsp;<a href="#N">N</a>,&nbsp;<a href="#O">O</a>,&nbsp;<a href="#P">P</a>,&nbsp;<a href="#Q">Q</a>,&nbsp;<a href="#R">R</a>,&nbsp;<a href="#S">S</a>,&nbsp;<a href="#T">T</a>,&nbsp;<a href="#U">U</a>,&nbsp;<a href="#V">V</a>,&nbsp;<a href="#W">W</a>,&nbsp;<a href="#X">X</a>,&nbsp;<a href="#Y">Y</a>,&nbsp;<a href="#Z">Z</a>,&nbsp;
<p></p>
<hr />
<p class="tiny"><a href="../../en/manifest/topics.html">English</a>&nbsp;&nbsp;&nbsp;</p>
<hr />
┃",
  _opt_action.css_theme_default ? theme_light_0 : theme_dark_0,
  _opt_action.css_theme_default ? theme_light_1 : theme_dark_1,
) ~ "\n";
      char _prev_k = "_".to!char;
      int _kn;
      foreach(k0;
        hvst.subject_trees.keys
        .sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable)
      ) {
        if (k0.toUpper.to!(char[])[0] != _prev_k) {
          topics ~= format(q"┃<p class="letter"><a name="%s">%s</a></p><p class="book_index_lev1"><a name="a"></a></p>┃",
            k0.toUpper.to!(char[])[0],
            k0.toUpper.to!(char[])[0],
          );
          _prev_k = k0.toUpper.to!(char[])[0];
        }
        if (k0 != "_a") {
          topics ~= format(q"┃<p class="lev0"><a name="%s">%s</a></p>┃",
            k0, k0,) ~ "\n";
          if (_opt_action.very_verbose) {
            writeln("", k0);
          }
          if ("_a" in hvst.subject_trees[k0]) {
            foreach (t_a_;
              hvst.subject_trees[k0]["_a"]["_a"]["_a"]
              .multiSort!("toUpper(a.title) < toUpper(b.title)", "a.author < b.author", SwapStrategy.unstable)
            ) {
              _auth = [];
              if (t_a_.author_arr.length < 2) {
                _auth = format(q"┃ <a href="authors.html#%s">%s</a>┃",
                  t_a_.author_surname,
                  t_a_.author,
                );
              } else {
                foreach (a; t_a_.author_arr) {
                  _auth ~= format(q"┃ <a href="authors.html#%s">%s</a>,┃",
                    t_a_.author_surname,
                    a,
                  );
                }
              }
              topics ~= format(q"┃<p class="work"><a href="%s">"%s"</a> -%s┃",
                t_a_.path_html_segtoc,
                t_a_.title,
                _auth,
              ) ~ "\n";
              if (_opt_action.very_verbose) {
                writeln("- ", t_a_.title, " - ", t_a_.author);
              }
            }
          }
          foreach(k1;
            hvst.subject_trees[k0].keys
            .sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable)
          ) {
            if (k1 != "_a") {
              topics ~= format(q"┃<p class="lev1"><a name="%s">%s</a></p>┃",
                k1, k1,) ~ "\n";
              if (_opt_action.very_verbose) {
                writeln("  ", k1);
              }
              if ("_a" in hvst.subject_trees[k0][k1]) {
                foreach (t_a_;
                  hvst.subject_trees[k0][k1]["_a"]["_a"]
                  .multiSort!("toUpper(a.title) < toUpper(b.title)", "a.author < b.author", SwapStrategy.unstable)
                ) {
                  _auth = [];
                  if (t_a_.author_arr.length < 2) {
                    _auth = format(q"┃ <a href="authors.html#%s">%s</a>┃",
                      t_a_.author_surname,
                      t_a_.author,
                    );
                  } else {
                    foreach (a; t_a_.author_arr) {
                      _auth ~= format(q"┃ <a href="authors.html#%s">%s</a>,┃",
                        t_a_.author_surname,
                        a,
                      );
                    }
                  }
                  topics ~= format(q"┃<p class="work"><a href="%s">%s</a> -%s┃",
                    t_a_.path_html_segtoc,
                    t_a_.title,
                    _auth,
                  ) ~ "\n";
                  if (_opt_action.very_verbose) {
                    writeln("  - ", t_a_.title, " - ", t_a_.author);
                  }
                }
              }
            }
            foreach(k2;
              hvst.subject_trees[k0][k1].keys
              .sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable)
            ) {
              if (k2 != "_a") {
                topics ~= format(q"┃<p class="lev2"><a name="%s">%s</a></p>┃",
                  k2, k2,) ~ "\n";
                if (_opt_action.very_verbose) {
                  writeln("    ", k2);
                }
                if ("_a" in hvst.subject_trees[k0][k1][k2]) {
                  foreach (t_a_;
                    hvst.subject_trees[k0][k1][k2]["_a"]
                    .multiSort!("toUpper(a.title) < toUpper(b.title)", "a.author < b.author", SwapStrategy.unstable)
                  ) {
                    _auth = [];
                    if (t_a_.author_arr.length < 2) {
                      _auth = format(q"┃ <a href="authors.html#%s">%s</a>┃",
                        t_a_.author_surname,
                        t_a_.author,
                      );
                    } else {
                      foreach (a; t_a_.author_arr) {
                        _auth ~= format(q"┃ <a href="authors.html#%s">%s</a>,┃",
                          t_a_.author_surname,
                          a,
                        );
                      }
                    }
                    topics ~= format(q"┃<p class="work"><a href="%s">%s</a> -%s┃",
                      t_a_.path_html_segtoc,
                      t_a_.title,
                      _auth,
                    ) ~ "\n";
                    if (_opt_action.very_verbose) {
                      writeln("    - ", t_a_.title, " - ", t_a_.author);
                    }
                  }
                }
              }
              foreach(k3;
                hvst.subject_trees[k0][k1][k2].keys
                .sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable)
              ) {
                if (k3 != "_a") {
                  topics ~= format(q"┃<p class="lev3"><a name="%s">%s</a></p>┃",
                    k3, k3,) ~ "\n";
                  if (_opt_action.very_verbose) {
                    writeln("      ", k3);
                  }
                  {
                    foreach (t_a_;
                      hvst.subject_trees[k0][k1][k2][k3]
                      .multiSort!("toUpper(a.title) < toUpper(b.title)", "a.author < b.author", SwapStrategy.unstable)
                    ) {
                      _auth = [];
                      if (t_a_.author_arr.length < 2) {
                        _auth = format(q"┃<a href="authors.html#%s">%s</a>┃",
                          t_a_.author_surname,
                          t_a_.author,
                        );
                      } else {
                        foreach (a; t_a_.author_arr) {
                          _auth ~= format(q"┃ <a href="authors.html#%s">%s</a>,┃",
                            t_a_.author_surname,
                            a,
                          );
                        }
                      }
                      topics ~= format(q"┃ <p class="work"><a href="%s">%s</a> -%s┃",
                        t_a_.path_html_segtoc,
                        t_a_.title,
                        _auth,
                      ) ~ "\n";
                      if (_opt_action.very_verbose) {
                        writeln("      - ", t_a_.title, " - ", t_a_.author);
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
      topics
      ~= format(q"┃
<hr />
<a name="bottom" id="bottom"></a>
<a name="down" id="down"></a>
<a name="end" id="end"></a>
<a name="finish" id="finish"></a>
<a name="stop" id="stop"></a>
<a name="credits"></a>
</body>
</html>
┃") ~ "\n";
    import doc_reform.output.paths_output;
    auto out_pth = DocReformPathsHTML!()(_opt_action.output_dir_set, "");
    try {
      auto f       = File(out_pth.harvest("topics.html"), "w");
      foreach (o; topics) {
        f.writeln(o);
      }
    } catch (ErrnoException ex) {
      // Handle error
    }
  }
}