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

let
  cfg = config.local.services.octoprint;
in
{
  options.local.services.octoprint = with lib; {
    enable = mkEnableOption "octoprint";
  };

  config = lib.mkIf cfg.enable {
    services.octoprint = {
      enable = true;
      port = 33002;
      plugins = ps:
        let
          octoprintDisplayLayerProgress = ps.buildPlugin rec {
            pname = "DisplayLayerProgress";
            version = "1.28.0";

            src = pkgs.fetchFromGitHub {
              owner = "OllisGit";
              repo = "OctoPrint-DisplayLayerProgress";
              rev = version;
              sha256 = "sha256-FoQGv7a3ktodyQKOwR69/9Up+wPoW5NDq+k5LfP9WYs=";
            };
          };
          octoprintDashboard = ps.buildPlugin rec {
            pname = "Dashboard";
            version = "1.19.10";

            src = pkgs.fetchFromGitHub {
              owner = "j7126";
              repo = "OctoPrint-Dashboard";
              rev = version;
              sha256 = "sha256-d3HtSgJ9d6k7+F86aDuhq31jWZHdNxncFcK6MYPgUKo=";
            };
          };
          octoprintBedLevelVisualizer = ps.buildPlugin rec {
            pname = "BedLevelVisualizer";
            version = "1.1.1";

            src = pkgs.fetchFromGitHub {
              owner = "jneilliii";
              repo = "OctoPrint-BedLevelVisualizer";
              rev = version;
              sha256 = "sha256-6JcYvYgEmphp5zz4xZi4G0yTo4FCIR6Yh+MXYK7H7+w=";
            };
          };
        in
        [
          octoprintDisplayLayerProgress
          octoprintDashboard
          octoprintBedLevelVisualizer
        ];
    };
  };
}