{ pkgs, lib, ... }:

let
  dslrWebcamConfContent = ''
    alias dslr-webcam v4l2loopback
    options v4l2loopback exclusive_caps=1 max_buffers=2 card_label="DSLR" video_nr=10
  '';

  dslrUdevRule = ''
    ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="04a9", ENV{ID_USB_MODEL}=="Canon_Digital_Camera", RUN+="${pkgs.systemd}/bin/systemctl start dslr-webcam.service"
    ACTION=="remove", SUBSYSTEM=="usb", ATTR{idVendor}=="04a9", ENV{ID_USB_MODEL}=="Canon_Digital_Camera", RUN+="${pkgs.systemd}/bin/systemctl stop dslr-webcam.service"
  '';

  dslrWebcamScript = ''
    #!/bin/sh
    modprobe dslr-webcam || true
    exec "${pkgs.gphoto2}/bin/gphoto2" --stdout --capture-movie | "${pkgs.ffmpeg}/bin/ffmpeg" -i - -vcodec rawvideo -pix_fmt yuv420p -f v4l2 /dev/video10
  '';

  dslrWebcamService = ''
    [Unit]
    Description=DSLR Webcam Service
    After=network.target

    [Service]
    ExecStart=${pkgs.writeScriptBin "dslr-webcam" dslrWebcamScript}/bin/dslr-webcam
    ExecStop=/bin/kill -s TERM $MAINPID
    Restart=on-failure

    [Install]
    WantedBy=multi-user.target
  '';
in
{
  # Ensure your system configuration includes these options:

  boot.extraModulePackages = [ pkgs.linuxPackages.v4l2loopback ];

  # Load v4l2loopback module with the required options
  boot.extraModprobeConfig = dslrWebcamConfContent;

  # Udev rule for DSLR camera
  services.udev.extraRules = dslrUdevRule;

  # Install dslr-webcam script and systemd service
  environment.systemPackages = with pkgs; [
    (writeScriptBin "dslr-webcam" dslrWebcamScript)
  ];

  systemd.services.dslr-webcam = {
    description = "DSLR Webcam Service";
    serviceConfig = {
      ExecStart = "${pkgs.writeScriptBin "dslr-webcam" dslrWebcamScript}/bin/dslr-webcam";

      Restart = "on-failure";
    };
  };
}