{ 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" ] ''
    ${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 (emacs29.override { withX = true; withGTK3 = true; withAlsaLib = true; withGconf = true; withImageMagick = true; withXwidgets = true; });
      extraPackages = epkgs: ((packages epkgs));
      extraConfig = default-config; 
    };

  };
}