{ pkgs, config, ... }:
let
  ikiwikiBootstrapTheme = pkgs.fetchgit {
    url = "https://github.com/dequis/ikiwiki-bootstrap-theme.git";
    rev = "afaedf8460d03664be6f590cf632b8be05de77dc";
    hash = "sha256-iX/onqrsvzJdDrJ7WoQMnlAQtOA+rmi+esv25/IOsq8=";
  }; # TODO: fork and set link color to #6d2bff or something
  ikiwikiDataPath = "/mnt/data/ikiwiki";
  ikiwikiSettingsHeader = pkgs.writeText "ikiwiki-settings-header" ''
    # IkiWiki::Setup::Yaml - YAML formatted setup file
  '';
  ikiwikiSettings = {
    wikiname = "fi-zone";
    adminemail = "fi@ikiwiki.vs.grzb.de";
    adminuser = [
      "fi"
    ];
    banned_users = [];
    srcdir = "${ikiwikiDataPath}/fi-zone";
    destdir = "${ikiwikiDataPath}/public_html/fi-zone";
    url = "https://fi.nekover.se/";
    cgiurl = "https://fi.nekover.se/ikiwiki.cgi";
    reverse_proxy = 0;
    cgi_wrapper = "${ikiwikiDataPath}/public_html/fi-zone/ikiwiki.cgi";
    cgi_wrappermode = "06755";
    cgi_overload_delay = "";
    cgi_overload_message = "";
    only_committed_changes = 0;
    rcs = "";
    add_plugins = [
      "goodstuff"
      "websetup"
    ];
    disable_plugins = [];
    templatedir = "${ikiwikiBootstrapTheme}";
    underlaydir = "${pkgs.ikiwiki-full}/share/ikiwiki/basewiki";
    usedirs = 1;
    prefix_directives = 1;
    indexpages = 0;
    discussion = 0;
    html5 = 1;
    sslcookie = 1;
    default_pageext = "mdwn";
    htmlext = "html";
    timeformat = "%c";
    userdir = "";
    numbacklinks = 10;
    hardlink = 0;
    libdirs = [];
    libdir = "${ikiwikiDataPath}/.ikiwiki";
    ENV = {};
    timezone = ":/etc/localtime";
    wiki_file_chars = "-[:alnum:]+/.:_";
    allow_symlinks_before_srcdir = 0;
    cookiejar = {
      file = "${ikiwikiDataPath}/.ikiwiki/cookies";
    };
    useragent = "ikiwiki/${pkgs.ikiwiki-full.version}";
    responsive_layout = 1;
    deterministic = 0;
    rss = 1;
    atom = 1;
    blogspam_pagespec = "postcomment(*)";
    locked_pages = "* and !postcomment(*)";
    comments_pagespec = "posts/* and !*/Discussion";
    archive_pagespec = "page(posts/*) and !*/Discussion";
    global_sidebars = 0;
    tagbase = "tags";
  };
  ikiwikiSettingsFile = pkgs.concatText "fi-zone.setup" [
    ikiwikiSettingsHeader
    ((pkgs.formats.yaml { }).generate "fi-zone-settings" ikiwikiSettings)
  ];
  ikiwikiSetupAutomator = pkgs.writeScript "fi-zone.initial.setup" ''
    #!${pkgs.perl}/bin/perl
    require IkiWiki::Setup::Automator;
    IkiWiki::Setup::Automator->import(
      wikiname => '${ikiwikiSettings.wikiname}',
      adminuser => ['fi'],
      srcdir => '${ikiwikiSettings.srcdir}',
      destdir => '${ikiwikiSettings.destdir}',
      dumpsetup => '${ikiwikiSettings.wikiname}.setup',
      url => '${ikiwikiSettings.url}',
      cgiurl => '${ikiwikiSettings.cgiurl}',
      cgi_wrapper => '${ikiwikiSettings.cgi_wrapper}',
      adminemail => '${ikiwikiSettings.adminemail}',
      add_plugins => [qw{goodstuff websetup}],
      disable_plugins => [qw{}],
      libdir => '${ikiwikiSettings.libdir}',
      rss => 1,
      atom => 1,
      syslog => 1,
    )
  '';
in
{
  environment.systemPackages = with pkgs; [
    ikiwiki-full
  ];

  services.fcgiwrap.instances."ikiwiki" = {
    socket = {
      user = config.services.nginx.user;
      group = config.services.nginx.group;
    };
    process = {
      user = config.services.nginx.user;
      group = config.services.nginx.group;
    };
  };

  systemd.services.ikiwiki-initial-setup = {
    description = "Run the initial setup of ikiwiki and set permissions.";

    script = ''
      mkdir -p ${ikiwikiDataPath}
      chown ${config.services.nginx.user}:${config.services.nginx.group} ${ikiwikiDataPath}
      if [ ! -d "${ikiwikiSettings.srcdir}" ]; then
        ${pkgs.sudo}/bin/sudo -u ${config.services.nginx.user} ${pkgs.ikiwiki-full}/bin/ikiwiki --setup ${ikiwikiSetupAutomator}
      fi
    '';

    serviceConfig = {
      Type = "simple";
      User = "root";
      Group = "root";
    };

    wantedBy = [
      "multi-user.target"
    ];
  };

  systemd.services.ikiwiki-settings-setup = {
    description = "Setup ikiwiki with configuration managed by NixOS.";

    serviceConfig = {
      Type = "simple";
      ExecStart = "${pkgs.ikiwiki-full}/bin/ikiwiki --setup ${ikiwikiSettingsFile}";
      User = config.services.nginx.user;
      Group = config.services.nginx.group;
      Requires = [ "ikiwiki-initial-setup.service" ];
    };

    wantedBy = [
      "multi-user.target"
    ];
  };  
}