/++
  default settings
+/
module sdp.output.paths_output;
import std.array,
  std.path,
  std.regex,
  std.stdio;
import sdp.meta.rgx;
template SiSUpathsSisupod() {
  mixin SiSUrgxInit;
  static auto rgx = Rgx();
  string _base_dir_pod = "sisupod";
  string _base_dir_doc = "sisudoc";
  string _suffix = ".zip";
  auto SiSUpathsSisupod()() {
    struct _PathsStruct {
      string base_filename(string fn_src) {
        auto pth = fn_src.baseName.stripExtension;
        return pth;
      }
      string sisupod_dir() {
        auto pth = _base_dir_pod;
        return pth;
      }
      string sisudoc_dir() {
        auto pth = _base_dir_doc;
        return pth;
      }
      string sisupod_filename(string fn_src) {
        string pth = _base_dir_pod.chainPath(base_filename(fn_src) ~ _suffix).array;
        return pth;
      }
      string base_filesystem(string fn_src) {
        string pth = _base_dir_pod.chainPath(base_filename(fn_src)).array;
        assert(pth == _base_dir_pod ~ "/"  ~ base_filename(fn_src),
          pth ~ " == "  ~ _base_dir_pod ~ "/" ~ base_filename(fn_src) ~ "?");
        return pth;
      }
      string base_pod(string fn_src) {
        string pth = _base_dir_pod.chainPath(base_filename(fn_src)).array; // change this
        return pth;
      }
    }
    return _PathsStruct();
  }
}

template SiSUpathsSisupods() {
  mixin SiSUrgxInit;
  static auto rgx = Rgx();
  string _base_dir_pod = "sisupod";
  string _base_dir_doc = "sisudoc";
  string _suffix = ".zip";
  auto SiSUpathsSisupods(Ps,Lng)(
    Ps  src_pth_info,
    Lng lng,
  ) {
    struct _PodPaths {
      string base_filename_(string fn_src) {
        auto pth = fn_src.baseName.stripExtension;
        return pth;
      }
      string sisupod_dir_() {
        auto pth = _base_dir_pod;
        return pth;
      }
      string sisudoc_dir_() {
        auto pth = _base_dir_doc;
        return pth;
      }
      string sisupod_filename_(string fn_src) {
        string pth = _base_dir_pod.chainPath(base_filename_(fn_src) ~ _suffix).array;
        return pth;
      }
      string base_filesystem_(string fn_src) {
        string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array;
        assert(pth == _base_dir_pod ~ "/"  ~ base_filename_(fn_src),
          pth ~ " == "  ~ _base_dir_pod ~ "/" ~ base_filename_(fn_src) ~ "?");
        return pth;
      }
      string base_pod_(string fn_src) {
        string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; // change this
        return pth;
      }
      auto base_filename(string fn_src) {
        auto pth_1_ = base_filename_(fn_src);
        auto pth_2_ = base_filename_(fn_src);
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            return pth_2_;
          }
        }
        return _pods();
      }
      auto sisupod_filename(string fn_src) {
        auto pth_1_ = sisupod_filename_(fn_src);
        auto pth_2_ = sisupod_filename_(fn_src);
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            return pth_2_;
          }
        }
        return _pods();
      }
      auto base(string fn_src) {
        auto pth_1_ = "";
        auto pth_2_ = base_filesystem_(fn_src);
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            return pth_2_;
          }
        }
        return _pods();
      }
      auto pod_root(string fn_src) {
        auto pth_1_ = "";
        auto pth_2_ = base(fn_src).filesystem_open_zpod.chainPath("").array; // "sisudoc"
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            return pth_2_;
          }
        }
        return _pods();
      }
      auto conf_root(string fn_src) {
        auto pod_root_ = pod_root(fn_src);
        auto pth_1_ = "conf";
        auto pth_2_ = pod_root(fn_src).filesystem_open_zpod.chainPath("conf").array;
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
            return pth_2_;
          }
        }
        return _pods();
      }
      auto css(string fn_src) {
        auto pod_root_ = pod_root(fn_src);
        auto pth_1_ = conf_root(fn_src).zpod.chainPath("css").array;
        auto pth_2_ = conf_root(fn_src).filesystem_open_zpod.chainPath("css").array;
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
            return pth_2_;
          }
        }
        return _pods();
      }
      auto media_root(string fn_src) {
        auto pod_root_ = pod_root(fn_src);
        auto pth_1_ = "media";
        auto pth_2_ = pod_root(fn_src).filesystem_open_zpod.chainPath("media").array;
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
            return pth_2_;
          }
        }
        return _pods();
      }
      auto text_root(string fn_src) {
        auto pod_root_ = pod_root(fn_src);
        auto pth_1_ = media_root(fn_src).zpod.chainPath("text").array;
        auto pth_2_ = media_root(fn_src).filesystem_open_zpod.chainPath("text").array;
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
            return pth_2_;
          }
        }
        return _pods();
      }
      auto doc(string fn_src) {
        auto pod_root_ = pod_root(fn_src);
        auto pth_1_ = text_root(fn_src).zpod;
        auto pth_2_ = text_root(fn_src).filesystem_open_zpod;
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
            return pth_2_;
          }
        }
        return _pods();
      }
      auto doc_lng(string fn_src) {
        auto pod_root_ = pod_root(fn_src);
        auto pth_1_ = text_root(fn_src).zpod.chainPath(lng).array;
        auto pth_2_ = text_root(fn_src).filesystem_open_zpod.chainPath(lng).array;
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
            return pth_2_;
          }
        }
        return _pods();
      }
      auto image_root(string fn_src) {
        auto pod_root_ = pod_root(fn_src);
        auto pth_1_ = media_root(fn_src).zpod.chainPath("image").array;
        auto pth_2_ = media_root(fn_src).filesystem_open_zpod.chainPath("image").array;
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
            return pth_2_;
          }
        }
        return _pods();
      }
      auto fn_pod_filelist(string fn_src) {
        auto pod_root_ = pod_root(fn_src);
        auto pth_1_ = "sisudoc.txt";
        auto pth_2_ = pod_root(fn_src).filesystem_open_zpod.chainPath("sisudoc.txt").array;
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
            return pth_2_;
          }
        }
        return _pods();
      }
      auto fn_doc(string fn_src) {
        auto pod_root_ = pod_root(fn_src);
        auto pth_1_ = doc_lng(fn_src).zpod.chainPath(fn_src.baseName).array;
        auto pth_2_ = doc_lng(fn_src).filesystem_open_zpod.chainPath(fn_src.baseName).array;
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
            return pth_2_;
          }
        }
        return _pods();
      }
      auto fn_doc_insert(string fn_src, string fn_insert) {
        auto pod_root_ = pod_root(fn_src);
        auto pth_1_ = doc_lng(fn_src).zpod.chainPath(fn_insert.baseName).array;
        auto pth_2_ = doc_lng(fn_src).filesystem_open_zpod.chainPath(fn_insert.baseName).array;
        struct _pods {
          auto zpod() {
            return pth_1_;
          }
          auto filesystem_open_zpod() {
            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
            return pth_2_;
          }
        }
        return _pods();
      }
    }
    return _PodPaths();
  }
}
template SiSUoutPaths() {
  auto SiSUoutPaths(Ps,Lng)(
    Ps  src_pth_info,
    Lng lng,
  ) {
    struct _PathsStruct {
      string output_root() {
        return "sisugen";
      }
      string output_base() {
        return output_root.chainPath(lng).array;
      }
    }
    return _PathsStruct();
  }
}
template SiSUpathsHTML() {
  mixin SiSUrgxInit;
  static auto rgx = Rgx();
  auto SiSUpathsHTML(Ps,Lng)(
    Ps  src_pth_info,
    Lng lng,
  ) {
    auto out_pth = SiSUoutPaths!()(src_pth_info, lng);
    string base_dir = "html";
    string suffix = ".html";
    struct _PathsStruct {
      string base_filename(string fn_src) {
        return fn_src.baseName.stripExtension;
      }
      string base() {
        return (out_pth.output_base).chainPath(base_dir).array;
      }
      string image() {
        return (out_pth.output_root).chainPath("image").array;
      }
      string css() {
        return (out_pth.output_root).chainPath("css").array;
      }
      string fn_seg_css() {
        return css.chainPath("html_seg.css").array;
      }
      string fn_scroll_css() {
        return css.chainPath("html_scroll.css").array;
      }
      string seg(string fn_src) {
        return base.chainPath(base_filename(fn_src)).array;
      }
      string fn_scroll(string fn_src) {
        return base.chainPath(base_filename(fn_src) ~ suffix).array;
      }
      string fn_seg(string fn_src, string seg_filename) {
        return seg(fn_src).chainPath(seg_filename ~ suffix).array;
      }
    }
    return _PathsStruct();
  }
}
template SiSUpathsEPUB() {
  mixin SiSUrgxInit;
  static auto rgx = Rgx();
  auto SiSUpathsEPUB(Ps,Lng)(
    Ps  src_pth_info,
    Lng lng,
  ) {
    auto out_pth = SiSUoutPaths!()(src_pth_info, lng);
    string base_dir = "epub";
    struct _PathsStruct {
      string base() {
        return (out_pth.output_base).chainPath(base_dir).array;
      }
      string base_filename(string fn_src) {
        return fn_src.baseName.stripExtension;
      }
      string epub_file(string fn_src) {
        return base.chainPath(base_filename(fn_src) ~ ".epub").array;
      }
      string dirtop() {
        return "".chainPath("").array;
      }
      string doc_meta_inf(string fn_src) {
        return dirtop.chainPath("META-INF").array;
      }
      string doc_oebps(string fn_src) {
        return dirtop.chainPath("OEBPS").array;
      }
      string doc_oebps_css(string fn_src) {
        return doc_oebps(fn_src).chainPath("css").array;
      }
      string doc_oebps_image(string fn_src) {
        return doc_oebps(fn_src).chainPath("image").array;
      }
      string fn_mimetypes(string fn_src) {
        return dirtop.chainPath("mimetypes").array;
      }
      string fn_dmi_container_xml(string fn_src) {
        return doc_meta_inf(fn_src).chainPath("container.xml").array;
      }
      string fn_oebps_toc_nav_xhtml(string fn_src) {
        return doc_oebps(fn_src).chainPath("toc_nav.xhtml").array;
      }
      string fn_oebps_toc_ncx(string fn_src) {
        return doc_oebps(fn_src).chainPath("toc.ncx").array;
      }
      string fn_oebps_content_opf(string fn_src) {
        return doc_oebps(fn_src).chainPath("content.opf").array;
      }
      string fn_oebps_content_xhtml(string fn_src, string seg_filename) {
        return doc_oebps(fn_src).chainPath(seg_filename ~ ".xhtml").array;
      }
      string fn_oebps_css(string fn_src) {
        return doc_oebps_css(fn_src).chainPath("epub.css").array;
      }
      debug(epub_output) {
        string dbg_docdir(string fn_src) {
          return base.chainPath(base_filename(fn_src)).array;
        }
        string dbg_docdir_oebps(string fn_src) {
          return dbg_docdir(fn_src).chainPath("OEBPS").array;
        }
        string dbg_doc_meta_inf(string fn_src) {
          return dbg_docdir(fn_src).chainPath("META-INF").array;
        }
        string dbg_doc_oebps(string fn_src) {
          return dbg_docdir(fn_src).chainPath("OEBPS").array;
        }
        string dbg_doc_oebps_css(string fn_src) {
          return dbg_doc_oebps(fn_src).chainPath("css").array;
        }
        string dbg_doc_oebps_image(string fn_src) {
          return dbg_doc_oebps(fn_src).chainPath("image").array;
        }
        string dbg_fn_mimetypes(string fn_src) {
          return dbg_docdir(fn_src).chainPath("mimetypes").array;
        }
        string dbg_fn_dmi_container_xml(string fn_src) {
          return dbg_doc_meta_inf(fn_src).chainPath("container.xml").array;
        }
        string dbg_fn_oebps_toc_nav_xhtml(string fn_src) {
          return dbg_docdir_oebps(fn_src).chainPath("toc_nav.xhtml").array;
        }
        string dbg_fn_oebps_toc_ncx(string fn_src) {
          return dbg_docdir_oebps(fn_src).chainPath("toc.ncx").array;
        }
        string dbg_fn_oebps_content_opf(string fn_src) {
          return dbg_docdir_oebps(fn_src).chainPath("content.opf").array;
        }
        string dbg_fn_oebps_content_xhtml(string fn_src, string seg_filename) {
          return dbg_docdir_oebps(fn_src).chainPath(seg_filename ~ ".xhtml").array;
        }
        string dbg_fn_oebps_css(string fn_src) {
          return dbg_doc_oebps_css(fn_src).chainPath("epub.css").array;
        }
      }
    }
    return _PathsStruct();
  }
}
template SiSUpathsSQLiteDiscrete() {
  mixin SiSUrgxInit;
  static auto rgx = Rgx();
  auto SiSUpathsSQLiteDiscrete(Ps,Lng)(
    Ps  src_pth_info,
    Lng lng,
  ) {
    auto out_pth = SiSUoutPaths!()(src_pth_info, lng);
    string base_dir = "sqlite";
    struct _PathsStruct {
      string base_filename(string fn_src) {
        return fn_src.baseName.stripExtension;
      }
      string base() {
        return (out_pth.output_base).chainPath(base_dir).array;
      }
      string seg(string fn_src) {
        return base.chainPath(base_filename(fn_src)).array;
      }
      string sqlite_file(string fn_src) {
        return base.chainPath(base_filename(fn_src) ~ ".sqlite").array;
      }
    }
    return _PathsStruct();
  }
}
template SiSUpathsSQLite() {
  mixin SiSUrgxInit;
  static auto rgx = Rgx();
  auto SiSUpathsSQLite(Ps,Lng)(
    Ps  src_pth_info,
    Lng lng,
  ) {
    auto out_pth = SiSUoutPaths!()(src_pth_info, lng);
    string base_dir = "sqlite";
    struct _PathsStruct {
      string base_filename(string fn_src) {
        return fn_src.baseName.stripExtension;
      }
      string base() {
        return (out_pth.output_base).chainPath(base_dir).array;
      }
      string seg(string fn_src) {
        return base.chainPath(base_filename(fn_src)).array;
      }
      string sqlite_file(string fn_src) {
        return base.chainPath(base_filename(fn_src) ~ ".sqlite").array;
      }
    }
    return _PathsStruct();
  }
}