{
  config,
  lib,
  pkgs,
  ...
}: let
  inherit
    (lib)
    mkOptionDefault
    ;
in {
  home-manager.users.alarsyo = {
    home.stateVersion = "23.11";

    my.home.laptop.enable = true;

    # Keyboard settings & i3 settings
    my.home.x.enable = true;
    my.home.x.i3bar.temperature.chip = "k10temp-pci-*";
    my.home.x.i3bar.temperature.inputs = ["Tctl"];
    my.home.x.i3bar.networking.throughput_interfaces = ["wlp1s0"];
    my.home.emacs.enable = true;

    my.theme = config.home-manager.users.alarsyo.my.themes.solarizedLight;

    services = {
      # TODO: place in global home conf
      dunst.enable = true;
      wlsunset = {
        enable = true;
        latitude = 48.9;
        longitude = 2.3;
        temperature = {
          day = 6500;
          night = 3500;
        };
      };
      darkman = {
        enable = true;
        settings = {
          lat = 48.9;
          lng = 2.3;
        };
      };
    };

    home.packages = builtins.attrValues {
      inherit
        (pkgs)
        ansel
        chromium # some websites only work there :(
        nwg-displays
        shikane # output autoconfig
        swaybg
        zotero
        ;

      inherit
        (pkgs.packages)
        spot
        ;
    };

    wayland.windowManager.sway = let
      logoutMode = "[L]ogout, [S]uspend, [P]oweroff, [R]eboot";
      lock = "swaylock --daemonize --image ~/.wallpaper --scaling fill";
    in {
      enable = true;
      swaynag.enable = true;
      wrapperFeatures.gtk = true;
      config = {
        modifier = "Mod4";
        input = {
          "type:keyboard" = {
            xkb_layout = "fr";
            xkb_variant = "us";
          };
          "type:touchpad" = {
            dwt = "enabled";
            tap = "enabled";
            middle_emulation = "enabled";
            natural_scroll = "enabled";
          };
        };
        output = {
          "eDP-1" = {
            scale = "1.5";
          };
        };
        fonts = {
          names = ["Iosevka Fixed" "FontAwesome6Free"];
          size = 9.0;
        };
        bars = [];

        keybindings = mkOptionDefault {
          "Mod4+Shift+a" = "exec shikanectl reload";
          "Mod4+Shift+e" = ''mode "${logoutMode}"'';
          "Mod4+i" = "exec emacsclient --create-frame";
          "Mod4+Control+l" = "exec ${lock}";
          "XF86AudioMute" = "exec wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
          "XF86AudioLowerVolume" = "exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- -l 1.2";
          "XF86AudioRaiseVolume" = "exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ -l 1.2";
          "XF86MonBrightnessUp" = "exec light -A 5";
          "XF86MonBrightnessDown" = "exec light -U 5";
        };

        modes = mkOptionDefault {
          "${logoutMode}" = {
            "l" = "exec --no-startup-id swaymsg exit, mode default";
            "s" = "exec --no-startup-id systemctl suspend, mode default";
            "p" = "exec --no-startup-id systemctl poweroff, mode default";
            "r" = "exec --no-startup-id systemctl reboot, mode default";
            "Escape" = "mode default";
            "Return" = "mode default";
          };
        };

        menu = "fuzzel --list-executables-in-path";

        startup = [
          {command = "shikane";}
          {command = "waybar";}
          {
            command = "swaybg --image ~/.wallpaper --mode fill";
            always = true;
          }
          {command = "swayidle -w idlehint 1 before-sleep \"${lock}\"";}
        ];
      };

      extraConfig = ''
        bindswitch --reload --locked lid:off output eDP-1 enable;
        bindswitch --reload --locked lid:on output eDP-1 disable;

        bindgesture swipe:right workspace prev
        bindgesture swipe:left workspace next

        set $rosewater #dc8a78
        set $flamingo #dd7878
        set $pink #ea76cb
        set $mauve #8839ef
        set $red #d20f39
        set $maroon #e64553
        set $peach #fe640b
        set $yellow #df8e1d
        set $green #40a02b
        set $teal #179299
        set $sky #04a5e5
        set $sapphire #209fb5
        set $blue #1e66f5
        set $lavender #7287fd
        set $text #4c4f69
        set $subtext1 #5c5f77
        set $subtext0 #6c6f85
        set $overlay2 #7c7f93
        set $overlay1 #8c8fa1
        set $overlay0 #9ca0b0
        set $surface2 #acb0be
        set $surface1 #bcc0cc
        set $surface0 #ccd0da
        set $base #eff1f5
        set $mantle #e6e9ef
        set $crust #dce0e8

        # target                 title     bg        text   indicator  border
        client.focused           $lavender $lavender $base  $rosewater $lavender
        client.focused_inactive  $overlay0 $base     $text  $rosewater $overlay0
        client.unfocused         $overlay0 $base     $text  $rosewater $overlay0
        client.urgent            $peach    $base     $peach $overlay0  $peach
        client.placeholder       $overlay0 $base     $text  $overlay0  $overlay0
        client.background        $base

        smart_borders on
        default_border pixel 3
        gaps inner 5
        gaps outer 3
      '';
    };

    programs = {
      fuzzel.enable = true;
      swaylock.enable = true;
      waybar = {
        enable = true;
      };
    };

    home.sessionVariables = {
      NIXOS_OZONE_WL = "1";
    };
  };

  # FIXME: belongs elsewhere
  services = {
    logind = {
      lidSwitch = "suspend";
      lidSwitchExternalPower = "ignore";
      extraConfig = ''
        IdleAction=suspend
        IdleActionSec=10min
      '';
    };
    upower.enable = true;
  };
}