module doc_reform.meta.metadochead;
template DocReformHarvestGetFromHead() { // TODO
  import
    std.datetime,
    std.getopt,
    std.file,
    std.path,
    std.process;
  import
    doc_reform.meta,
    doc_reform.meta.metadoc_summary,
    doc_reform.meta.metadoc_from_src,
    doc_reform.meta.conf_make_meta_structs,
    doc_reform.meta.conf_make_meta_toml,
    doc_reform.meta.conf_make_meta_json,
    doc_reform.meta.defaults,
    doc_reform.meta.doc_debugs,
    doc_reform.meta.rgx,
    doc_reform.source.paths_source,
    doc_reform.source.read_config_files,
    doc_reform.source.read_source_files,
    doc_reform.output.hub;
  mixin DocReformRgxInit;
  mixin contentJSONtoDocReformStruct;
  mixin DocReformBiblio;
  mixin DocReformRgxInitFlags;
  mixin outputHub;
  enum headBody { header, body_content, insert_file_list, image_list }
  enum makeMeta { make, meta }
  enum docAbst  { doc_abstraction, section_keys, segnames, segnames_0_4, images }
  static auto rgx = Rgx();
  auto DocReformHarvestGetFromHead(E,O,M)( // TODO
    E _env,
    O _opt_action,
    M _manifest
  ){
    auto _config_document_struct = readConfigDoc!()(_manifest, _env);    // document config file
    auto _config_local_site_struct = readConfigSite!()(_manifest, _env); // local site config
    ConfCompositePlus _make_and_meta_struct;
    _make_and_meta_struct = configParseTOMLreturnDocReformStruct!()(_make_and_meta_struct, _config_document_struct);
    _make_and_meta_struct = configParseTOMLreturnDocReformStruct!()(_make_and_meta_struct, _config_local_site_struct);
    /+ ↓ read file (filename with path) +/
    /+ ↓ file tuple of header and content +/
    if ((_opt_action.debug_do)
    || (_opt_action.very_verbose)
    ) {
      writeln("step1 commence → (get document header & body & insert file list & if needed image list)"
      );
    }
    auto _header_body_insertfilelist_imagelist
      = DocReformRawMarkupContent!()(_opt_action, _manifest.src.path_and_fn);
    static assert(!isTypeTuple!(_header_body_insertfilelist_imagelist));
    static assert(_header_body_insertfilelist_imagelist.length==4);
    if ((_opt_action.debug_do)
    || (_opt_action.very_verbose)
    ) {
      writeln("- step1 complete");
    }
    debug(header_and_body) {
      writeln(header);
      writeln(_header_body_insertfilelist_imagelist.length);
      writeln(_header_body_insertfilelist_imagelist.length[headBody.body_content][0]);
    }
    /+ ↓ split header into make and meta +/
    if ((_opt_action.debug_do)
    || (_opt_action.very_verbose)
    ) {
      writeln("step2 commence → (read document header - toml, return struct)");
    }
    _make_and_meta_struct =
    docHeaderMakeAndMetaTupTomlExtractAndConvertToStruct!()(
      _make_and_meta_struct,
      _header_body_insertfilelist_imagelist[headBody.header]
    );
    if ((_opt_action.debug_do)
    || (_opt_action.very_verbose)
    ) {
      writeln("- step2 complete");
    }
    
    auto t = tuple(doc_matters_shared, doc_matters_abridged_collected);
    static assert(t.length==2);
    return t;
  }
}