{ inputs, config, pkgs, ... }:

{
  imports = [
    ../home-manager/fonts.nix
    ../home-manager/terminal.nix
    ../home-manager/firefox/firefox.nix
    ../home-manager/development/tools.nix
    ../home-manager/development/vscode.nix
    ../home-manager/development/helix.nix
    ../home-manager/gaming.nix
  ];

  terminal.nixUpdateLocation = "/home/worble/Projects/nixos#tuxedo";
  terminal.flakeUpdateLocation = "/home/worble/Projects/nixos";

  # Home Manager needs a bit of information about you and the paths it should
  # manage.
  home.username = "worble";
  home.homeDirectory = "/home/worble";

  # This value determines the Home Manager release that your configuration is
  # compatible with. This helps avoid breakage when a new Home Manager release
  # introduces backwards incompatible changes.
  #
  # You should not change this value, even if you update Home Manager. If you do
  # want to update the value, then make sure to first check the Home Manager
  # release notes.
  home.stateVersion = "24.05"; # Please read the comment before changing.

  # The home.packages option allows you to install Nix packages into your
  # environment.
  home.packages = with pkgs;[
    # # Adds the 'hello' command to your environment. It prints a friendly
    # # "Hello, world!" when run.
    # pkgs.hello

    # # It is sometimes useful to fine-tune packages, for example, by applying
    # # overrides. You can do that directly here, just don't forget the
    # # parentheses. Maybe you want to install Nerd Fonts with a limited number of
    # # fonts?
    # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; })

    # # You can also create simple shell scripts directly inside your
    # # configuration. For example, this adds a command 'my-hello' to your
    # # environment:
    # (pkgs.writeShellScriptBin "my-hello" ''
    #   echo "Hello, ${config.home.username}!"
    # '')

    # general
    thunderbird
    keepassxc
    qbittorrent
    gimp-with-plugins
    joplin-desktop
    obsidian
    libreoffice-qt

    # cmd line tools
    rclone
    inotify-tools
    libnotify
    ffmpeg-full

    # comms   
    teamspeak_client
    webcord
    teams-for-linux

    # media
    strawberry-qt6
    jellyfin-media-player
    haruna

    # misc
    electrum
    gpu-screen-recorder-gtk
  ];

  # Home Manager is pretty good at managing dotfiles. The primary way to manage
  # plain files is through 'home.file'.
  home.file = {
    # # Building this configuration will create a copy of 'dotfiles/screenrc' in
    # # the Nix store. Activating the configuration will then make '~/.screenrc' a
    # # symlink to the Nix store copy.
    # ".screenrc".source = dotfiles/screenrc;

    # # You can also set the file content immediately.
    # ".gradle/gradle.properties".text = ''
    #   org.gradle.console=verbose
    #   org.gradle.daemon.idletimeout=3600000
    # '';
  };

  # Home Manager can also manage your environment variables through
  # 'home.sessionVariables'. These will be explicitly sourced when using a
  # shell provided by Home Manager. If you don't want to manage your shell
  # through Home Manager then you have to manually source 'hm-session-vars.sh'
  # located at either
  #
  #  ~/.nix-profile/etc/profile.d/hm-session-vars.sh
  #
  # or
  #
  #  ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh
  #
  # or
  #
  #  /etc/profiles/per-user/worble/etc/profile.d/hm-session-vars.sh
  #
  home.sessionVariables = {
    NIXOS_OZONE_WL = "1";
  };

  # home.sessionPath = [
  #   "$HOME/.local/bin"
  # ];

  services.nextcloud-client = {
    enable = true;
    startInBackground = true;
  };

  # Let Home Manager install and manage itself.
  programs = {
    home-manager.enable = true;

    firefox = {
      profiles.work = import ../home-manager/firefox/firefox-profile.nix // {
        id = 1;
        name = "work";
        isDefault = false;
        settings = {
          # allow fonts
          "browser.display.use_document_fonts" = 1;
          # home page
          "browser.startup.homepage" = "https://outlook.office.com|https://teams.microsoft.com/v2|https://dev.azure.com/binhsps/Connect/_boards/board/t/Development%20Team/Stories";
        };
      };
    };

    chromium = {
      enable = true;
      package = pkgs.brave;
    };

    # install the shaders from anime4k directory for this to work
    mpv = {
      enable = true;
      config = {
        profile = "gpu-hq";
        vo = "gpu-next";
        gpu-api = "vulkan";
        hwdec = "vulkan";
        screenshot-directory = "/mnt/HDD1/Pictures/";
        screenshot-template = "%F/%F_snapshot_%P";
        glsl-shaders = "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_VL.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_VL.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl";
      };
    };

    mangohud = {
      enable = true;
      enableSessionWide = true;
      settings = {
        preset = 1;
      };
    };
  };

  systemd.user = {
    services = {
      rclone-media = {
        Unit = {
          Description = "rclone-media /mnt/HDD1/Videos/";
          After = [ "network.target" "mnt-HDD1.mount" ];
        };

        Install = {
          WantedBy = [ "default.target" ];
        };

        Service = {
          Type = "exec";
          ExecStart = "${pkgs.writeShellApplication {
name = "rclone-media";
runtimeInputs = [ pkgs.inotify-tools pkgs.libnotify pkgs.rclone ];
text = ''
              function rclonecopy {
                  file=$1
                  changed_rel=''${file#"/mnt/HDD1/Videos"}
                  notify-send -a "rclone-media" "rclone for $file triggered"
                  if rclone copyto "$file" media:"media-7gM2gcrxRjXqfj$changed_rel" ; then
                      notify-send -a "rclone-media" "rclone complete for $file"
                  else
                      notify-send -u critical -a "rclone-media" "rclone failed for $file"
                  fi
              }

              inotifywait -mr \
                  --format '%w%f' \
                  -e close_write \
                  /mnt/HDD1/Videos/ |
              while read -r file; do
                  rclonecopy "$file"
              done
            '';
}}/bin/rclone-media";
        };
      };
    };
  };
}
