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

let cfg = config.sydnix.discord;
in {
  options.sydnix.discord = {
    enable = lib.mkEnableOption "Discord";
    fixWayland = lib.mkOption {
      description = ''
        Fix flickering on Wayland.
      '';
      type = lib.types.bool;
      default = false;
    };
  };

  config = lib.mkIf cfg.enable
    (let
      # Fixes flickering and platform detection on Wayland.
      vesktop-wayland-wrapper =
        pkgs.symlinkJoin {
          name = "vesktop-wayland-wrapper";
          paths = [ pkgs.callPackage pkgs.vesktop ];
          buildInputs = [ pkgs.makeWrapper ];
          postBuild = ''
            wrapProgram $out/bin/vesktop \
              --add-flags "--disable-gpu-compositing"
              # --add-flags "--disable-gpu-compositing --ozone-platform-hint=auto"
          '';
        };
    in {
      sydnix.impermanence.directories =
        let xdg-config-home = 
          config.home.confighome
              or "${config.home.homeDirectory}/.config";
        in [
          # This directory should really be written in terms of
          # `config.programs.nixcord.vesktopConfigDir`, but it defaults to null
          # for unknown reasons.  This is in conflict with the docs, which claim
          # it should be the path used here.
          (lib.removePrefix
            config.home.homeDirectory
            "${xdg-config-home}/vesktop/sessionData")
        ];

      programs.nixcord = {
        enable = true;
        discord = {
          # Install Vesktop without Discord.
          enable = false;
          # openASAR.enable = true;
          vencord.enable = false;
          vencord.package = pkgs.vencord;
        };
        vesktop = {
          enable = true;
          # package =
          #   if cfg.fixWayland
          #   then vesktop-wayland-wrapper
          #   else pkgs.vesktop;
        };
      };
    });
}
