{ lib, stdenv, buildEnv, fetchurl, perl, perlPackages, makeWrapper }:

# This package isn't extremely useful as it is, but is getting close.
# After running:
#
#   nix-build . -A rt
#
# I created a config file named myconfig.pm with:
#
#   use utf8;
#   Set($rtname, '127.0.0.1');
#   # These dirs need to be pre-created:
#   Set($MasonSessionDir, '/home/grahamc/foo/sessiondir/');
#   Set($MasonDataDir, '/home/grahamc/foo/localstate/');
#   Set($WebPort, 8080);
#
#   Set($DatabaseType, "SQLite");
#   Set( $DatabaseName, '/home/grahamc/projects/foo/my.db' );
#
#   1;
#
# and ran
#
#  RT_SITE_CONFIG=$(pwd)/myconfig.pm ./result/bin/rt-setup-database --action init
#
# Then:
#
#   RT_SITE_CONFIG=$(pwd)/myconfig.pm ./result/bin/rt-server
#
# Make sure to check out result/etc/RT_Config.pm
#
# Good luck.
stdenv.mkDerivation rec {
  pname = "rt";

  version = "4.4.4";

  src = fetchurl {
    url = "https://download.bestpractical.com/pub/rt/release/${pname}-${version}.tar.gz";
    sha256 = "1108jhz1gvalcfnbzgpbk7fkxzxkkc7m74a3bnwyjzldlyj1dhrl";
  };

  patches = [ ./override-generated.patch ];

  buildInputs = [
    makeWrapper
    perl
    (buildEnv {
      name = "rt-perl-deps";
      paths = with perlPackages; (requiredPerlModules [
        ApacheSession BusinessHours CGIEmulatePSGI CGIPSGI
        CSSMinifierXS CSSSquish ConvertColor CryptEksblowfish
        CryptSSLeay DBDSQLite DBDmysql DBIxSearchBuilder DataGUID
        DataICal DataPagePageset DateExtract DateManip
        DateTimeFormatNatural DevelGlobalDestruction EmailAddress
        EmailAddressList FCGI FCGIProcManager FileShareDir FileWhich
        GD GDGraph GnuPGInterface GraphViz HTMLFormatTextWithLinks
        HTMLFormatTextWithLinksAndTables HTMLMason
        HTMLMasonPSGIHandler HTMLQuoted HTMLRewriteAttributes
        HTMLScrubber IPCRun IPCRun3 JSON JavaScriptMinifierXS LWP
        LWPProtocolHttps LocaleMaketextFuzzy LocaleMaketextLexicon
        LogDispatch MIMETools MIMETypes MailTools ModuleRefresh
        ModuleVersionsReport MozillaCA NetCIDR NetIP PerlIOeol Plack
        RegexpCommon RegexpCommonnetCIDR RegexpIPv6 RoleBasic
        ScopeUpper Starlet SymbolGlobalName TermReadKey
        TextPasswordPronounceable TextQuoted TextTemplate
        TextWikiFormat TextWrapper TimeParseDate TreeSimple
        UNIVERSALrequire XMLRSS
      ]);
    })
  ];

  preConfigure = ''
    configureFlags="$configureFlags --with-web-user=$UID"
    configureFlags="$configureFlags --with-web-group=$(id -g)"
    configureFlags="$configureFlags --with-rt-group=$(id -g)"
    configureFlags="$configureFlags --with-bin-owner=$UID"
    configureFlags="$configureFlags --with-libs-owner=$UID"
    configureFlags="$configureFlags --with-libs-group=$(id -g)"
  '';
  configureFlags = [
    "--enable-graphviz"
    "--enable-gd"
    "--enable-gpg"
    "--with-db-type=SQLite"
  ];

  buildPhase = ''
    make testdeps | grep -i missing | sort
  '';

  preFixup = ''
    for i in $(find $out/bin -type f; find $out/sbin -type f); do
      wrapProgram $i \
          --prefix PERL5LIB ':' $PERL5LIB
    done
  '';

  meta = {
    platforms = lib.platforms.unix;
  };
}