{ lib, ... }: 

let
  inherit (lib) literalExample mkOption types;
in

{
  enable = mkOption {
    type = types.bool;
    default = false;
    description = "Enable Git repository hosting.";
  };
  cgit = mkOption {
    type = types.bool;
    default = true;
    description = "Enable cgit."; # TODO better desc; talk about nginx
  };
  dataDir = mkOption {
    type = types.str;
    default = "/var/lib/git";
    description = "Directory used to store repositories.";
  };
  etcDir = mkOption {
    type = types.str;
    default = "/etc/git";
  };
  rules = mkOption {
    type = types.unspecified;
  };
  repos = mkOption {
    type = types.attrsOf (types.submodule ({
      options = {
        desc = mkOption {
          type = types.nullOr types.str;
          default = null;
          description = ''
            Repository description.
          '';
        };
        section = mkOption {
          type = types.nullOr types.str;
          default = null;
          description = ''
            Repository section.
          '';
        };
        name = mkOption {
          type = types.str;
          description = ''
            Repository name.
          '';
        };
        hooks = mkOption {
          type = types.attrsOf types.str;
          description = ''
            Repository-specific hooks.
          '';
        };
        public = mkOption {
          type = types.bool;
          default = false;
          description = ''
            Allow everybody to read the repository via HTTP if cgit enabled.
          '';
          # TODO allow every configured user to fetch the repository via SSH.
        };
      };
    }));

    default = {};

    example = literalExample ''
      {
        testing = {
          name = "testing";
          hooks.post-update = '''
            #! /bin/sh
            set -euf
            echo post-update hook: $* >&2
          ''';
        };
        testing2 = { name = "testing2"; };
      }
    '';

    description = ''
      Repositories.
    '';
  };
  users = mkOption {
    type = types.unspecified;
  };
}