{ config, lib, pkgs, materusArg, ... }:
let
  configPath = "${materusArg.cfg.path}" + "/extraFiles/config/emacs/";

  inits = import ./init.nix { path = configPath; inherit pkgs; };
  packages = epkgs: with epkgs; [
    load-relative
    elcord
    persp-mode
    dashboard
    magit
    helm
    avy
    corfu
    vterm
    centaur-tabs
    projectile
    company
    clipetty

    treemacs
    treemacs-nerd-icons
    treemacs-perspective
    treemacs-icons-dired
    treemacs-magit
    treemacs-projectile
    tree-edit
    vertico
    nerd-icons
    nerd-icons-completion
    perspective
    minions
    telephone-line
    rainbow-delimiters
    use-package

    cmake-mode
    lsp-mode
    lsp-java
    lsp-jedi
    lsp-haskell
    lsp-ui
    lsp-treemacs
    dap-mode
    d-mode
    multiple-cursors
    org
    org-rainbow-tags
    org-roam
    org-roam-ui
    org-review
    markdown-mode
    json-mode
    nix-mode

    minimap


    moe-theme
    doom-themes
  ];


  default-config = ''
    (defvar materus/nix-packages t)
    (defvar materus/init-from-home nil)
    (unless materus/init-from-home
            (message "Config loading not from homeDir, need \"materus/init-from-home\" variable in init.el")
            ${setNixInit}
            ${inits.initText}
          )
  '';

  emacsPkgs = with pkgs;[
    python3
    lua
    multimarkdown
    git
  ];


  cfg = config.materus.profile.editor.emacs;


  setNixInit = ''
    (setenv "PATH" (concat (getenv "PATH") ":${lib.makeBinPath emacsPkgs}"))
    ${builtins.concatStringsSep "\n" (builtins.map (x: "(setq exec-path (append exec-path '(\""+x+"/bin\")))" ) emacsPkgs)}
    (call-process-shell-command "${pkgs.xorg.xmodmap}/bin/xmodmap -e \"keycode 66 = Hyper_L\" -e \"remove Mod4 = Hyper_L\" -e \"add Mod3 = Hyper_L\" &" nil 0)
  '';
in
{
  options.materus.profile.editor.emacs.enable = materusArg.pkgs.lib.mkBoolOpt false "Enable emacs with materus cfg";

  config = lib.mkIf cfg.enable {
    home.activation.emacsCompile = lib.hm.dag.entryAfter [ "linkGeneration" ] ''
      run ${config.programs.emacs.finalPackage}/bin/emacs --batch \
      --eval '(setq warning-minimum-log-level :error)' \
      --eval '(byte-compile-file "${config.xdg.configHome}/emacs/early-init.el")' \
      --eval '(byte-compile-file "${config.xdg.configHome}/emacs/init.el")'
    '';
    xdg.configFile."emacs/init.el".text = ''
      (defvar materus/nix-packages nil)
      (defvar materus/init-from-home t)
      (setq-default materus/init-from-home t)
    
      ${setNixInit}
      ${inits.initText}
    '';

    xdg.configFile."emacs/early-init.el".text = ''
      ${inits.earlyInitText}
    '';

    programs.emacs = {
      enable = true;
      package = with pkgs; lib.mkDefault materusArg.pkgs.emacs-materus;
      extraPackages = epkgs: ((packages epkgs));
      extraConfig = default-config;
    };

  };
}