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

let
  cfg = config.programs.blender;

  blenderVersion = lib.versions.majorMinor cfg.package.version;
  addons = pkgs.runCommand "blender-system-resources" {
    passAsFile = [ "paths" ];
    paths = cfg.addons ++ [ cfg.package ];
    nativeBuildInputs = with pkgs; [ outils ];
  } ''
    mkdir -p $out
    for i in $(cat $pathsPath); do
      resourcesPath="$i/share/blender"
      if [ -d $i/share/blender/${blenderVersion} ]; then
        resourcesPath="$i/share/blender/${blenderVersion}";
      fi
      lndir -silent $resourcesPath $out
    done
  '';
in {
  options.programs.blender = {
    enable = lib.mkEnableOption "Blender, a 3D computer graphics tool";

    package = lib.mkPackageOption pkgs "blender" {
      example = ''
        pkgs.blender-with-packages {
          name = "sample-studio-wrapped";
          packages = with pkgs.python3Packages; [ pandas ];
        }
      '';
    };

    addons = lib.mkOption {
      type = with lib.types; listOf package;
      description = ''
        List of packages providing Blender system resources at
        {file}`/share/blender` or at {file}`/share/blender/$MAJORMINORVERSION`.
      '';
      default = [ ];
      defaultText = "[]";
      example = lib.literalExpression ''
        with pkgs; [
          blender-addons-machin3tools
          blender-addons-glslTexture
        ]
      '';
    };
  };

  config = lib.mkIf cfg.enable (lib.mkMerge [
    {
      basePackages = [ cfg.package ];

      wrappers.blender = { arg0 = lib.getExe' cfg.package "blender"; };
    }

    (lib.mkIf (builtins.length cfg.addons > 0) {
      wrappers.blender.env.BLENDER_SYSTEM_RESOURCES.value = addons;
    })
  ]);
}
