# This file contains common configuration applied to every host.
# It should only `enable` options defined in the `modules/by-name` directory.
{
  config,
  pkgs,
  lib,
  ...
}: {
  soispha = {
    boot.enable = true;
    cleanup.enable = true;
    documentation.enable = true;

    fonts = {
      enable = true;
      enableEmoji = true;
    };

    home-manager.enable = true;
    impermanence = {
      enable = true;

      directories = [
        "/etc/nixos"
        "/var/log"
        "/var/lib/systemd"
        "/var/lib/nixos"
      ];
    };
    polkit.enable = true;
    power.enable = true;

    services = {
      adb = {
        enable = true;
        user = "soispha";
      };
      fwupd.enable = true;
      mpd = {
        enable = true;
        directories = let
          data = "${config.home-manager.users.soispha.xdg.dataHome}/mpd";
        in {
          inherit data;
          playlists = "${data}/playlists";
          runtime = "/run/user/${builtins.toString config.users.users.soispha.uid}/mpd";
          music = config.home-manager.users.soispha.programs.beets.settings.directory;
        };
        mpc = {
          enable = true;
          beetsPkg = config.home-manager.users.soispha.programs.beets.package;
        };
      };
      ollama.enable = false;
      postgresql.enable = false;
      printing.enable = true;
      scanning.enable = true;
      snapper.enable = true;
      steam.enable = false;
      systemDiff.enable = true;
      unison = {
        enable = true;

        foreign.userName = "soispha";
        dataDir = "${config.home-manager.users.soispha.xdg.dataHome}/unison";
        userSourceDir = "/srv/home/soispha";
        pathsToIgnore = let
          extractTarget = attr: "~/${attr.target}";
          homeManagerSymlinks =
            builtins.map extractTarget
            (builtins.attrValues
              config.home-manager.users.soispha.home.file);
        in
          [
            # already synchronized by the taskserver
            "~/.local/share/task"

            # Should not be synchronized
            "~/.local/share/unison"

            # Is just to big to be synchronized (# TODO: Work around that <2024-08-31> )
            "~/media/music"
          ]
          ++ homeManagerSymlinks;

        pathsToSync = [
          "~/.local/state/mpv"
          "~/.local/state/nvim"
          "~/.local/share"
          "~/.local/.Trash-1000"

          "~/.mozilla/firefox"

          "~/media"
          "~/school"
          "~/repos"
        ];
      };
    };

    programs = {
      nvim = {
        enable = true;
        shell = pkgs.zsh;
      };
      atuin.enable = true;
      direnv.enable = true;
      git.enable = true;
      imv.enable = true;
      less.enable = true;
      lf.enable = true;
      river = {
        enable = true;
        init = {
          rules = [
            {
              app-id = "float";
              title = "*";
              action = "float";
            }
            {
              app-id = "mpv";
              title = "*";
              action = "float";
            }
            {
              app-id = "ModernGL";
              title = "*";
              action = "float";
            }
            {
              app-id = "*";
              title = "Manim Slides";
              action = "float";
            }
            {
              app-id = "*";
              title = "floating please";
              action = "float";
            }

            {
              app-id = "*";
              title = "*";
              action = "ssd";
            }
            # This remove the focus border around Firefox (which is useful because the Firefox is nearly always in its own tag.)
            {
              app-id = "firefox";
              title = "*";
              action = "csd";
            }
          ];
          generalSettings = {
            # background
            background-color = "0x002b36";
            border-color-focused = "0x93a1a1";
            border-color-unfocused = "0x586e75";

            # keyboard repeat rate
            set-repeat = ["50" "300"];

            # Cursor
            focus-follows-cursor = "normal";
            # hide-cursor = ["timeout" "2000"];
            hide-cursor = ["when-typing" "enabled"];
            set-cursor-warp = "on-output-change";
            xcursor-theme = ["Nordzy-cursors" "24"];
          };
          inputs = {
            pointer-1133-49970-Logitech_Gaming_Mouse_G502 = [["pointer-accel" "0"] ["accel-profile" "none"]];
            pointer-12951-6505-ZSA_Technology_Labs_Moonlander_Mark_I = [["pointer-accel" "0"] ["accel-profile" "none"]];
          };
          backgroundStart = [
            pkgs.gammastep
            pkgs.yambar

            pkgs.mako
            ["${lib.getExe pkgs.swaybg}" "--image" "${./abstract-nord.png}"]
            pkgs.swayidle
            pkgs.alacritty
          ];
        };
      };
      mpv.enable = true;
      swaylock.enable = true;
      taskwarrior.enable = true;
      yambar.enable = true;
      yt.enable = true;
      zathura.enable = true;
      zsh.enable = true;
    };

    sound.enable = true;
    version.enable = true;
  };
}