/*
  inserts
  ao_inserts.d
*/
mixin template SiSUdocInserts() {
  class Inserts {
    auto scan_subdoc_source(
      char[][] markup_sourcefile_insert_content, string fn_src, int add
    ) {
      char[][100000] cont_arbitrary_max_length_set_;
      auto ft0 = flag_type.dup;
      auto ft1 = flag_type.dup;
      string[string] processing;
      uint[string] line_occur;
      auto obj_im = new ObjInlineMarkup();
      auto obj_att = new ObjAttrib();
      int[string] counter; counter["add"]=0;
      mixin ScreenTxtColors;
      auto rgx = new Rgx();
      int tell_l(string color, in char[] line) {
        writeln(scr_txt_marker[color], line);
        return 0;
      }
      auto fn_pth_full = match(fn_src, rgx.src_pth);
      auto markup_src_file_path = fn_pth_full.captures[1];
      foreach (line; markup_sourcefile_insert_content) {
        if (ft1["curly_code"] == 1) {
          ft1["header_make"] = 0;
          ft1["header_metadata"] = 0;
          if (auto m = match(line, rgx.block_curly_code_close)) {
            ft1["curly_code"] = 0;
          }
          cont_arbitrary_max_length_set_[counter["add"]] = line;
          ++counter["add"]; ++add;
        } else if (auto m = match(line, rgx.block_curly_code_open)) {
          ft1["curly_code"] = 1;
          ft1["header_make"] = 0;
          ft1["header_metadata"] = 0;
          cont_arbitrary_max_length_set_[counter["add"]] = line;
          ++counter["add"]; ++add;
        } else if (ft1["tic_code"] == 1) {
          ft1["header_make"] = 0;
          ft1["header_metadata"] = 0;
          if (auto m = match(line, rgx.block_tic_close)) {
            ft1["tic_code"] = 0;
          }
          cont_arbitrary_max_length_set_[counter["add"]] = line;
          ++counter["add"]; ++add;
        } else if (auto m = match(line, rgx.block_tic_code_open)) {
          ft1["tic_code"] = 1;
          ft1["header_make"] = 0;
          ft1["header_metadata"] = 0;
          cont_arbitrary_max_length_set_[counter["add"]] = line;
          ++counter["add"]; ++add;
        } else if (
          (ft1["header_make"] == 1) && (line_occur["header_make"] > 0)
          && match(line, rgx.header_sub)
        ) {
            ft1["header_make"] = 1;
            ft1["header_metadata"] = 0;
            ++line_occur["header_make"];
            ++counter["add"];
        } else if (
          (ft1["header_metadata"] == 1) && (line_occur["header_metadata"] > 0)
          && match(line, rgx.header_sub)
        ) {
            ft1["header_metadata"] = 1;
            ft1["header_make"] = 0;
            ++line_occur["header_metadata"];
            ++counter["add"];
        } else if (auto m = match(line, rgx.insert_src_fn_ssi_or_sst)) {
          ft1["header_make"] = 0;
          ft1["header_metadata"] = 0;
          auto insert_fn = m.captures[2];
          auto insert_sub_pth = m.captures[1];
          auto fn_src_insert =
            (markup_src_file_path ~ insert_sub_pth ~ insert_fn);
          auto raw = new MarkupRaw();
          auto markup_sourcesubfile_insert_content =
            raw.markupInsertSourceContentRawLineArray(fn_src_insert);
          debug(insert) {                              // insert file
            tell_l("red", line);
            tell_l("red", fn_src_insert);
            tell_l("fuchsia", "ERROR");
            writeln(
              "  length contents insert array: ",
              markup_sourcesubfile_insert_content.length
            );
          }
            auto ins = new Inserts();
          /*
            1. load file,
            2. read lines;
            3. scan lines,
            4. if filename insert, and insert filename
            5.   repeat 1
            6. else
            7.   add line to new array;
          */
        } else {
          ft1["header_make"] = 0;
          ft1["header_metadata"] = 0;
          cont_arbitrary_max_length_set_[counter["add"]] = line;
          ++counter["add"]; ++add;
        }
      } // end src subdoc (inserts) loop
      auto contents_ = cont_arbitrary_max_length_set_[0 .. counter["add"]].dup;
      auto t = tuple(contents_, add);
      return t;
    }
    auto scan_doc_source(char[][] markup_sourcefile_content, string fn_src) {
      char[][100000] cont_arbitrary_max_length_set; // 2000 pg * 50 lines
      string[string] processing;
      uint[string] line_occur;
      auto obj_im = new ObjInlineMarkup();
      auto obj_att = new ObjAttrib();
      auto ft = flag_type.dup;
      int add;
      mixin ScreenTxtColors;
      auto rgx = new Rgx();
      int tell_l(string color, in char[] line) {
        writeln(scr_txt_marker[color], line);
        return 0;
      }
      auto fn_pth_full = match(fn_src, rgx.src_pth);
      auto markup_src_file_path = fn_pth_full.captures[1];
      foreach (line; markup_sourcefile_content) {
        if (ft["curly_code"] == 1) {
          ft["header_make"] = 0;
          ft["header_metadata"] = 0;
          if (auto m = match(line, rgx.block_curly_code_close)) {
            ft["curly_code"] = 0;
          }
          cont_arbitrary_max_length_set[add] = line;
          ++add;
        } else if (auto m = match(line, rgx.block_curly_code_open)) {
          ft["curly_code"] = 1;
          ft["header_make"] = 0;
          ft["header_metadata"] = 0;
          cont_arbitrary_max_length_set[add] = line;
          ++add;
        } else if (ft["tic_code"] == 1) {
          ft["header_make"] = 0;
          ft["header_metadata"] = 0;
          if (auto m = match(line, rgx.block_tic_close)) {
            ft["tic_code"] = 0;
          }
          cont_arbitrary_max_length_set[add] = line;
          ++add;
        } else if (auto m = match(line, rgx.block_tic_code_open)) {
          ft["tic_code"] = 1;
          ft["header_make"] = 0;
          ft["header_metadata"] = 0;
          cont_arbitrary_max_length_set[add] = line;
        } else if ((ft["header_make"] == 1)
        && (line_occur["header_make"] > 0)
        && match(line, rgx.header_sub)) {
          ++line_occur["header_make"];
          cont_arbitrary_max_length_set[add] = line;
          ++add;
        } else if ((ft["header_metadata"] == 1)
        && (line_occur["header_metadata"] > 0)
        && match(line, rgx.header_sub)) {
          ++line_occur["header_metadata"];
          cont_arbitrary_max_length_set[add] = line;
          ++add;
        } else if (auto m = match(line, rgx.header_make)) {
          ft["header_make"] = 1;
          ++line_occur["header_make"];
          cont_arbitrary_max_length_set[add] = line;
          ++add;
        } else if (auto m = match(line, rgx.header_metadata)) {
          ft["header_metadata"] = 1;
          ++line_occur["header_metadata"];
          cont_arbitrary_max_length_set[add] = line;
          ++add;
        } else if (auto m = match(line, rgx.insert_src_fn_ssi_or_sst)) {
          ft["header_make"] = 0;
          ft["header_metadata"] = 0;
          auto insert_fn = m.captures[2];
          auto insert_sub_pth = m.captures[1];
          auto fn_src_insert =
            (markup_src_file_path ~ insert_sub_pth ~ insert_fn);
          auto raw = new MarkupRaw();
          auto markup_sourcefile_insert_content =
            raw.markupInsertSourceContentRawLineArray(fn_src_insert);
          debug(insert) {                              // insert file
            tell_l("red", line);
            tell_l("red", fn_src_insert);
            writeln(
              "  length contents insert array: ",
              markup_sourcefile_insert_content.length
            );
          }
            auto ins = new Inserts();
            auto t = ins.scan_subdoc_source(
              markup_sourcefile_insert_content, to!string(fn_src_insert), add
            );
            static assert(!isTypeTuple!(t));
            auto tmparr = t[0];
            auto addsub = t[1];
            cont_arbitrary_max_length_set[add .. addsub-1] = tmparr[0 .. $-1];
            add=addsub;
          /*
            1. load file,
            2. read lines;
            3. scan lines,
            4. if filename insert, and insert filename
            5.   repeat 1
            6. else
            7.   add line to new array;
          */
        } else {
          ft["header_make"] = 0;
          ft["header_metadata"] = 0;
          cont_arbitrary_max_length_set[add] = line;
          ++add;
        }
      } // end src doc loop
      auto contents = cont_arbitrary_max_length_set[0..add].dup;
      debug(insert) {                              // insert file
        writeln(__LINE__);
        writeln(contents.length);
        writeln(add);
      }
      return contents;
    }
  }
}