{ lib, stdenv, fetchFromGitHub, gtk-engine-murrine, sassc
, accent ? [ "default" ], shade ? "dark", size ? "standard", tweaks ? [ ], }:

let
  validAccents = [
    "default"
    "purple"
    "pink"
    "red"
    "orange"
    "yellow"
    "green"
    "teal"
    "grey"
    "all"
  ];
  validShades = [ "light" "dark" ];
  validSizes = [ "standard" "compact" ];
  validTweaks = [ "frappe" "macchiato" "black" "float" "outline" "macos" ];

  single = x: lib.optional (x != null) x;
  pname = "Catppuccin";
in lib.checkListOfEnum "${pname} Valid theme accent(s)" validAccents accent
lib.checkListOfEnum "${pname} Valid shades" validShades (single shade)
lib.checkListOfEnum "${pname} Valid sizes" validSizes (single size)
lib.checkListOfEnum "${pname} Valid tweaks" validTweaks tweaks

stdenv.mkDerivation {
  pname = "${pname}";
  version = "0-unstable-2024-06-27";

  src = fetchFromGitHub {
    owner = "Fausto-Korpsvart";
    repo = "Catppuccin-GTK-Theme";
    rev = "0bd2869e7f0fdb36c720a4fb873d4fed361b0606";
    hash = "sha256-oFVsYrJ27hYGY+x9+Z4SxVCp3w6PiLYTZaxmGhnpVHQ=";
  };

  nativeBuildInputs = [ sassc ];

  propagatedUserEnvPkgs = [ gtk-engine-murrine ];

  postPatch = ''
    find -name "*.sh" -print0 | while IFS= read -r -d ''' file; do
      patchShebangs "$file"
    done
  '';

  dontBuild = true;

  installPhase = ''
    runHook preInstall

    mkdir -p $out/share/themes

    ./themes/install.sh \
      --name ${pname} \
      ${toString (map (x: "--theme " + x) accent)} \
      ${lib.optionalString (shade != null) ("--color " + shade)} \
      ${lib.optionalString (size != null) ("--size " + size)} \
      ${toString (map (x: "--tweaks " + x) tweaks)} \
      --dest $out/share/themes

    runHook postInstall
  '';

  meta = with lib; {
    description = "GTK Theme with Catppuccin colour scheme";
    homepage = "https://github.com/Fausto-Korpsvart/Catppuccin-GTK-Theme";
    license = licenses.gpl3Only;
    # maintainers = with maintainers; [ icy-thought ];
    platforms = platforms.all;
  };
}
