{ inputs, pkgs, ... }:

let
  # NOTE: pinned nixpkgs to reduce updating huge packages
  pkgs-pinned = import inputs.nixpkgs-pinned {
    inherit (pkgs) system;
  };
in
{
  imports = [
    inputs.niri.homeModules.niri
    inputs.neovim-configuration.homeModules.default
  ];

  home.stateVersion = "24.11";
  home.username = "mora";
  home.homeDirectory = "/home/mora";

  ###
  ### Shells
  ###
  programs.bash.enable = true;
  programs.fish.enable = true;
  programs.nushell.enable = true;

  programs.carapace.enable = true;


  ###
  ### NeoVim
  ###
  # NOTE: this section works only due to neovim-configuration module
  nvim.enable = true;


  ###
  ### Software
  ###
  programs.eza.enable = true;
  programs.ripgrep.enable = true;
  programs.zoxide.enable = true;

  programs.git = {
    enable = true;
    delta.enable = true;
    includes = [{
      contents = {
        user.name = "Mora Unie Youer";
        user.email = "mora_unie_youer@riseup.net";
        user.signingKey = "0x7AB91D83B25E6D7F";
        commit.gpgSign = true;
        init.defaultBranch = "master";
        safe.directory = "*";
      };
    }];
  };

  programs.gpg = {
    enable = true;
    settings = {
      ask-cert-level = true;
      expert = true;
      list-options = [ "show-sig-expire" "show-uid-validity" "show-unusable-subkeys" "show-unusable-uids"];
      verify-options = [ "show-uid-validity" "show-unusable-uids" ];
      with-fingerprint = [ "" "" ]; # Repeat with-fingerprint twice
      with-keygrip = true;
    };
  };

  services.gpg-agent = {
    enable = true;
    enableSshSupport = true;
    pinentryPackage = pkgs.pinentry-gnome3;
  };

  services.gnome-keyring = {
    enable = true;
    components = [ "secrets" "ssh" ];
  };


  services.easyeffects.enable = true;


  ###
  ### Customization
  ###
  gtk.enable = true;
  gtk.font.name = "DejaVu Sans";
  gtk.font.size = 8;

  dconf.settings = {
    "org/gnome/desktop/interface" = {
      color-scheme = "prefer-dark";
    };
  };

  home.pointerCursor = let
    catppuccin-cursors' = pkgs-pinned.catppuccin-cursors.overrideAttrs (prev: {
      patchPhase = ''
        # FIX: GTK3-4 is screaming ;_;
        sed -i scripts/build-cursors -e 's/NOMINAL_SIZE=24/NOMINAL_SIZE=32/'
      '';
    });
  in {
    package = catppuccin-cursors'.mochaMauve;
    name = "catppuccin-mocha-mauve-cursors";
    size = 24;
    gtk.enable = true;
    x11.enable = true;
  };


  ###
  ### Graphical Session
  ###
  programs.niri.enable = true;
  programs.niri.package = pkgs.niri-unstable;


  ###
  ### Extra Packages
  ###
  home.packages = with pkgs; [
    # Fonts
    liberation_ttf
    noto-fonts
    noto-fonts-cjk-sans
    noto-fonts-emoji

    font-awesome
    nerd-fonts._0xproto
    nerd-fonts.fira-code

    # Utils
    inotify-tools
    libnotify
    xdg-utils
    wl-clipboard

    # Shell
    python3

    socat
    wireguard-tools

    # Applications
    fuzzel
    inputs.aylurs-gtk-shell.packages.${pkgs.system}.agsFull
    inputs.wezterm.packages.${pkgs.system}.default

    floorp

    _64gram

    fjordlauncher

    pkgs-pinned.kicad
  ];

  ###
  ### Extra Services
  ###
  systemd.user.services.wl-gammarelay-rs = let
    wl-gammarelay-rs' = pkgs.writeShellScript "wl-gammarelay-rs" ''
      ${pkgs.wl-gammarelay-rs}/bin/wl-gammarelay-rs &
      sleep 1
      busctl --user -- set-property rs.wl-gammarelay /outputs/DP_2 rs.wl.gammarelay Brightness d 0.7
      busctl --user -- set-property rs.wl-gammarelay /outputs/DP_3 rs.wl.gammarelay Brightness d 0.75
      busctl --user -- set-property rs.wl-gammarelay /outputs/DP_4 rs.wl.gammarelay Brightness d 0.65
      wait
    '';
  in {
    Unit.PartOf = [ "graphical-session.target" ];
    Unit.After = [ "niri.service" ];
    Unit.Wants = [ "niri.service" ];
    Install.WantedBy = [ "graphical-session.target" ];
    Service = {
      ExecStart = "${wl-gammarelay-rs'}";
      Restart = "on-failure";
    };
  };

  systemd.user.services.xwayland-satellite = {
    Unit.PartOf = [ "graphical-session.target" ];
    Unit.After = [ "niri.service" ];
    Unit.Wants = [ "niri.service" ];
    Install.WantedBy = [ "graphical-session.target" ];
    Service = {
      ExecStart = "${pkgs.xwayland-satellite-unstable}/bin/xwayland-satellite";
      Restart = "on-failure";
    };
  };
}