{
  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 (
    lib.mkMerge [
      {
        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.buildingIso) {
          hideMounts = true;
          users.talexander = {
            directories = [
              {
                directory = ".kube";
                user = "talexander";
                group = "talexander";
                mode = "0750";
              }
            ];
          };
        };
      }
    ]
  );
}