{ pkgs, lib, config, ... }:

let
  inherit (import ./const.nix) fontSize homedir gpgid;
  inherit (import ./theme.nix { inherit pkgs lib; })
    theme colors base16-scheme base16-scheme-filename
    xresourcesFile;
  xmonadPackages = self: [
    self.xmonad-contrib
    #self.taffybar # fails to build
    self.xmonad-extras
    self.monad-logger
  ];
in
{
  imports = [
    ./common.nix

    # nix-channel --add https://github.com/catppuccin/nix/archive/main.tar.gz catppuccin
    #<catppuccin/modules/home-manager>

  ];
  home = {
    pointerCursor = {
      package = pkgs.phinger-cursors;
      name = "phinger-cursors";
      x11.enable = true;
    };
    keyboard.options = [ "caps:ctrl_modifier" ];
    sessionVariables = {
      LOCALE_ARCHIVE = "${pkgs.glibcLocales}/lib/locale/locale-archive";
    };
    file = {
      mutt = {
        text = (builtins.readFile ./muttrc) +
          (builtins.readFile ./mutt/solarized.muttrc);
        target = ".muttrc";
      };
      mailcap = {
        source = ./mailcap;
        target = ".mailcap";
      };
      xbindkeys = {
        source = ./xbindkeysrc;
        target = ".xbindkeysrc";
      };
    };

    packages = with pkgs; [
      acpi
      apvlv
      beets
      bind
      blueman
      cmdtree
      dict
      dmenu
      feh
      flameshot
      firefoxpwa
      gajim
      glibcLocales # rofi locale fix -- https://github.com/rycee/home-manager/issues/354#issuecomment-415914278
      gnumake
      gnupg
      # keybase-gui
      libnotify
      lshw
      mplayer
      muchsync
      mumble
      nyxt
      pandoc
      pavucontrol
      pinentry
      tdesktop
      thunderbird
      # texlive.combined.scheme-full
      #tor-browser-bundle-bin
      usbutils
      vlc
      xbindkeys
      xclip
      xdotool
      xlayoutdisplay
      xorg.xmodmap
      xsel
      #xterm
      yank
      yt-dlp
      zathura
    ];
  };

  #catppuccin.flavor = "latte";
  #catppuccin.enable = true;

  fonts.fontconfig.enable = true;

  gtk.enable = false; # this fails because of some missing service file
  gtk.font.name = "Fira Sans";
  gtk.font.size = fontSize;
  gtk.font.package = pkgs.fira;
  gtk.theme.name = "Breeze";
  gtk.iconTheme.name = "hicolor";
  gtk.cursorTheme.name = "breeze_cursors";

  xresources = {
    properties = {
      #"XTerm*font" = "-*-FiraMono-medium-r-normal--${toString fontSize}-*-*-*-*-*-iso10646-1";
      #"XTerm*faceName" = "FireMono";
      #"XTerm*faceSize" = toString fontSize;
      #"XTerm*termName" = "xterm-256color";
      #"XTerm*metaSendsEscape" = true;
      #"XTerm*utf8" = true;
      #"Xautolock.time:" = 1;
      #"Xautolock.locker:" = "xlock";
      #"Xautolock.corners:" = "+0-0";
      #"Xautolock.cornerdelay:" = 3;
      #"Xautolock.notify:" = 30;
      #"Xautolock.notifier:" = "notify-send -u critical -t 10000 -- 'Locking screen in 30 seconds'";
    };
    extraConfig = builtins.readFile xresourcesFile;
  };

  services = {
    lorri.enable = false;
    emacs.enable = true;

    kbfs.enable = false;
    keybase.enable = false;

    mbsync = {
      frequency = "*:0/5";
      postExec = "${pkgs.notmuch}/bin/notmuch new";
    };


    dunst = {
      enable = true;
      settings = {
        global = {
          geometry = "320x5-10+30";
          transparency = 0;
          frame_color = colors."${theme}".highlight;
          frame_width = 3; # same as xmonad border
          separator_color = "frame";
          font = "Fira Sans";
          background = colors."${theme}".background;
          foreground = colors."${theme}".foreground;
          padding = 10;
          horizontal_padding = 10;
          word_wrap = "yes";
          markup = "full";
          format = "<b>%s</b>\\n%b\\n";
        };

        urgency_normal = {
          background = colors."${theme}".background;
          foreground = colors."${theme}".foreground;
          timeout = 10;
        };
      };
    };

    redshift = {
      enable = false;
      latitude = "40.80";
      longitude = "-81.52";
      temperature = {
        # orange = 1000, white = 5000
        day = 5000;
        night = 1800;
      };
    };

    random-background = {
      enable = false;
      enableXinerama = true;
      imageDirectory = "%h/wallpaper";
      interval = "30m";
    };

    gpg-agent = {
      defaultCacheTtl = 7200; # 2 hours
      enable = true;
      enableExtraSocket= true;
      enableScDaemon = true; # smart card support
      enableSshSupport = true;
      maxCacheTtl = 86400; # 24 hours
      pinentryPackage = pkgs.pinentry-all;
      verbose = true;
      extraConfig = ''
        allow-emacs-pinentry
      '';
      #sshKeys = [
      #  "8278B6132877C1911B07814D94FC4F29DF23FCA4"
      #];
    };
  };

  xsession = {
    enable = true;
    windowManager = {
      xmonad = {
        enable = true;
        extraPackages = xmonadPackages;
        enableContribAndExtras = true;
        config = ./xmonad.hs;
      };
    };
  };

  programs.gpg.enable = true;
  programs = {

    git.signing.signByDefault = true;

    firefox = {
      enable = true;
      package =
        if lib.versionAtLeast config.home.stateVersion "19.09"
        then pkgs.firefox
        else pkgs.firefox-unwrapped;
      nativeMessagingHosts = [ pkgs.firefoxpwa ];
    };

    qutebrowser = {
      enable = true;
      settings = {
        "colors.webpage.darkmode.enabled" =
          if theme == "dark" then true else false;

        "content.user_stylesheets" = "~/.userstyles.css"; # generated in common.nix

        # attempting to fix gl rendering
        "qt.force_software_rendering" = "qt-quick";
        #"backend" = "webkit";
      };
    };

    rofi = {
      enable = true;
      pass.enable = true;
      font = "Fira Mono 16";
      theme = "purple";
      plugins = with pkgs; [
        rofi-calc
        rofi-emoji
        rofi-file-browser
        rofi-menugen
        rofi-mpd
        rofi-pass
        rofi-systemd
      ];
    };
  };

  systemd.user = {
    services = {
      #"gpg-refresh".Service.ExecStart = "${pkgs.gnupg}/bin/gpg --refresh";
      # make it the same as 'systemctl show mpd | grep LimitMEMLOCK"
      # might not be necessary?
      #mpd.Service.LimitMEMLOCK = "2085444096";
    };
    timers = {
      #"gpg-refresh" = {
      #  Install.WantedBy = ["timers.target"];
      #  Timer.OnCalendar = "daily";
      #};
    };
  };
}