{ pkgs, lib, ... }:

let unstablePkgs = import <nixos-unstable> { };

in {
  nixpkgs.config.packageOverrides = pkgs: rec {

    letsencrypt-ca = import ./letsencrypt-ca.nix {
      stdenv = pkgs.stdenv;
      fetchurl = builtins.fetchurl;
    };

    minecraft-current = pkgs.minecraft-server_1_16_4;

    minecraft-server_1_16_4 = pkgs.minecraft-server.overrideAttrs
      (oldAttrs: rec {
        version = "1.15.1";
        src = builtins.fetchurl {
          url =
            "https://launcher.mojang.com/v1/objects/35139deedbd5182953cf1caa23835da59ca3d7cd/server.jar";
          sha256 = "01i5nd03sbnffbyni1fa6hsg5yll2h19vfrpcydlivx10gck0ka4";
        };
      });

    minecraft-server_1_15_1 = pkgs.minecraft-server.overrideAttrs
      (oldAttrs: rec {
        version = "1.15.1";
        src = builtins.fetchurl {
          url =
            "https://launcher.mojang.com/v1/objects/4d1826eebac84847c71a77f9349cc22afd0cf0a1/server.jar";
          sha256 =
            "a0c062686bee5a92d60802ca74d198548481802193a70dda6d5fe7ecb7207993";
        };
      });

    # DON'T LEAVE THE HASH--Nix will think the package hasn't changed
    minecraft-server_1_16_1 = let
      version = "1.16.1";
      url =
        "https://launcher.mojang.com/v1/objects/a412fd69db1f81db3f511c1463fd304675244077/server.jar";
      sha256 = "0nwkdig6yw4cnm2ld78z4j4xzhbm1rwv55vfxz0gzhsbf93xb0i7";
    in (pkgs.minecraft-server.overrideAttrs (oldAttrs: rec {
      name = "minecraft-server-${version}";
      inherit version;
      src = pkgs.fetchurl { inherit url sha256; };
    }));

    minecraft-server_1_16_2 = let
      version = "1.16.2";
      url =
        "https://launcher.mojang.com/v1/objects/c5f6fb23c3876461d46ec380421e42b289789530/server.jar";
      sha256 = "0fbghwrj9b2y9lkn2b17id4ghglwvyvcc8065h582ksfz0zys0i9";
    in (pkgs.minecraft-server.overrideAttrs (oldAttrs: rec {
      name = "minecraft-server-${version}";
      inherit version;
      src = pkgs.fetchurl { inherit url sha256; };
    }));

    postgresql_11_gssapi = pkgs.postgresql_11.overrideAttrs (oldAttrs: rec {
      configureFlags = oldAttrs.configureFlags ++ [ "--with-gssapi" ];
      buildInputs = oldAttrs.buildInputs ++ [ pkgs.krb5 ];
    });

    postgresql_12_gssapi = pkgs.postgresql_12.overrideAttrs (oldAttrs: rec {
      configureFlags = oldAttrs.configureFlags ++ [ "--with-gssapi" ];
      buildInputs = oldAttrs.buildInputs ++ [ pkgs.krb5 ];
    });

    hll2380dw-cups = import ./hll2380dw-cups.nix {
      inherit (pkgs)
        stdenv fetchurl makeWrapper cups dpkg a2ps ghostscript gnugrep gnused
        coreutils file perl which;
    };

    backplane-dns-client = import ./backplane-dns-client.nix {
      pkgs = pkgs;
      stdenv = pkgs.stdenv;
      fetchgit = pkgs.fetchgit;
      bundlerEnv = pkgs.bundlerEnv;
    };

    cl-gemini = import ./cl-gemini.nix { inherit pkgs localLispPackages; };

    fudo-service = import ./fudo-service.nix {
      fetchgit = pkgs.fetchgit;
      pkgs = pkgs;
    };

    google-photos-uploader = pkgs.buildGoModule rec {
      pname = "google-photos-uploader";
      version = "1.6.1";

      src = pkgs.fetchFromGitHub {
        owner = "int128";
        repo = "gpup";
        rev = "${version}";
        sha256 = "0zdkd5iwkp270p0810dijg25djkzrsdyqiqaqv6rzzgzj5d5pwhm";
      };

      modSha256 = "15ndc6jq51f9mz1v089416x2lxrifp3wglbxpff8b055jj07hbkw";

      subPackages = [ "." ];

      meta = with pkgs.lib; {
        description = "Google photos uploader, written in Go.";
        homepage = "https://github.com/int128/gpup";
        license = licenses.asl20;
        platforms = platforms.linux ++ platforms.darwin;
      };
    };

    doomEmacsInit = pkgs.writeShellScriptBin "doom-emacs-init.sh" ''
      DOOMDIR=$HOME/.emacs.d

      function clone_into() {
        ${pkgs.git}/bin/git clone https://github.com/hlissner/doom-emacs.git $1
      }

      if [ ! -d "$DOOMDIR" ]; then
        clone_into $DOOMDIR
        $DOOMDIR/bin/doom -y install
      fi

      if [ ! -f $DOOMDIR/bin/doom ]; then
        # legacy...move to a backup
        mv $HOME/.emacs.d $HOME/.emacs.d.bak
        mv $HOME/.emacs $HOME/.emacs.bak
        clone_into $DOOMDIR
        $DOOMDIR/bin/doom -y install
      fi

      $DOOMDIR/bin/doom sync

      #if ${pkgs.emacs}/bin/emacsclient -ca false -e '(delete-frame)'; then
      #  # emacs is running
      #  ${pkgs.emacs}/bin/emacsclient -e '(doom/reload)'
      #fi
    '';

    localLispPackages = (import ./lisp { inherit pkgs localLispPackages; })
      // pkgs.lispPackages;

    backplane-dns-server = import ./backplane-dns-server.nix {
      inherit localLispPackages;
      pkgs = unstablePkgs;
    };

    doom-emacs-config = pkgs.fetchgit {
      url = "https://git.fudo.org/niten/doom-emacs.git";
      rev = "349edaa2b3b34fa77591322d4345e304eb89bc3b";
      sha256 = "0kclivh6xx8zgw39hg6kf7mfg95qhni16pma2fskr0q7akrnsva7";
    };

    vanilla-forum = import ./vanilla-forum.nix { pkgs = pkgs; };

    openttd-data = pkgs.fetchgit {
      url = "https://git.fudo.org/fudo-public/openttd-data.git";
      rev = "5b7dd0ca9014e642e1f2d0aa3154b5da869911d3";
      sha256 = "061k0f0jgm5k81djslb172xk0wkis0m878izgisyj2qgg3wf1awh";
    };

    textfiles = pkgs.fetchgit {
      url = "https://git.informis.land/informis/textfiles.git";
      rev = "278a90f7ce219e36e5de0a80b540e469a9bce912";
      sha256 = "06qns3ayc84mamdgn0jw652rvx60wy9km1vxm2361mzmx2zk89iw";
    };
  };
}