{
  config,
  lib,
  pkgs,
  ...
}:

let
  alias_kx = pkgs.writeShellScriptBin "kx" ''
    exec ${pkgs.kubeswitch}/bin/switcher "''${@}"
  '';
  alias_ks = pkgs.writeShellScriptBin "ks" ''
    exec ${pkgs.kubeswitch}/bin/switcher namespace "''${@}"
  '';
  alias_k = pkgs.writeShellScriptBin "k" ''
    exec ${pkgs.kubectl}/bin/kubectl "''${@}"
  '';
  alias_ka = pkgs.writeShellScriptBin "ka" ''
    exec ${pkgs.kubectl}/bin/kubectl "''${@}" --all-namespaces
  '';
  alias_kdel = pkgs.writeShellScriptBin "kdel" ''
    exec ${pkgs.kubectl}/bin/kubectl delete --all "''${@}"
  '';
  alias_kd = pkgs.writeShellScriptBin "kd" ''
    export KUBECTL_EXTERNAL_DIFF="${pkgs.colordiff}/bin/colordiff -N -u"
    exec ${pkgs.kubectl}/bin/kubectl diff "''${@}"
  '';
  alias_klog = pkgs.writeShellScriptBin "klog" ''
    exec ${pkgs.kubectl}/bin/kubectl logs --all-containers "$@"
  '';
  decrypt_k8s_secret =
    (pkgs.writeScriptBin "decrypt_k8s_secret" (builtins.readFile ./files/decrypt_k8s_secret.bash))
    .overrideAttrs
      (old: {
        buildCommand = "${old.buildCommand}\n patchShebangs $out";
        nativeBuildInputs = [ pkgs.makeWrapper ];
        postBuild = ''
          wrapProgram $out/bin/decrypt_k8s_secret --prefix PATH : ${
            lib.makeBinPath [
              pkgs.kubectl
              pkgs.jq
            ]
          }
        '';
      });
in
{
  imports = [ ];

  options.me = {
    kubernetes.enable = lib.mkOption {
      type = lib.types.bool;
      default = false;
      example = true;
      description = "Whether we want to install kubernetes.";
    };
  };

  config = lib.mkIf config.me.kubernetes.enable {
    environment.systemPackages = with pkgs; [
      kubectl
      kubeswitch
      stern
      alias_kx
      alias_ks
      alias_k
      alias_ka
      alias_kdel
      alias_kd
      alias_klog
      decrypt_k8s_secret
      ingress2gateway # Convert ingress yaml to gateway yaml
    ];

    environment.persistence."/persist" = lib.mkIf (config.me.mountPersistence) {
      hideMounts = true;
      users.talexander = {
        directories = [
          {
            directory = ".kube";
            user = "talexander";
            group = "talexander";
            mode = "0750";
          }
        ];
      };
    };
  };
}
