# Primary shell configuration — Nushell with environment, aliases, and integrations.
{
  config,
  lib,
  ...
}:
with lib; let
  cfg = config.base.shell.nushell;
in {
  # Enabled by default — base modules are always-on.
  options.base.shell.nushell.enable = (mkEnableOption "enable nushell") // {default = true;};

  config = mkIf cfg.enable {
    programs.nushell = {
      enable = true;
      envFile.text = ''
          $env.config.show_banner = false
          $env.NIX_PATH = "nixpkgs=channel:nixos-unstable"
          $env.NIX_LOG = "iunfo"
          $env.WEBKIT_DISABLE_COMPOSITING_MODE = "1"
          $env.TERMINAL = "ghostty"
          $env.EDITOR = "nvim"
          $env.VISUAL = "zeditor"
          $env.FZF_DEFAULT_COMMAND = "fd --type f --exclude .git --follow --hidden"
          $env.FZF_DEFAULT_OPTS = "--preview='bat --color=always -n {}' --bind 'ctrl-/:toggle-preview' --header 'Press CTRL-Y to copy command into clipboard' --bind 'ctrl-y:execute-silent(echo -n {2..} | wl-copy)+abort' --color bg:#282a36,bg+:#44475a,fg:#f8f8f2,fg+:#f8f8f2,header:#6272a4,hl:#bd93f9,hl+:#bd93f9,info:#ffb86c,marker:#ff79c6,pointer:#ff79c6,prompt:#50fa7b,spinner:#ffb86c"
          $env.XDG_DATA_HOME = $"($env.HOME)/.local/share"
          $env.SSH_AUTH_SOCK = "/run/user/1000/gnupg/S.gpg-agent.ssh"
          $env.PATH = ($env.PATH | split row (char esep) | append $"($env.HOME)/.cargo/bin" | append $"($env.HOME)/.cache/.bun/bin"
        | append $"($env.HOME)/.npm-global/bin" | uniq)
          $env.CARGO_HOME = $"($env.HOME)/.cargo"
          $env.NPM_CONFIG_PREFIX = $"($env.HOME)/.npm-global"
          $env.FLAKE = $"($env.HOME)/p/NIX/nixos-config"

          # Load kestractl-env from agenix
          if ("/run/agenix/kestractl-env" | path exists) {
            open /run/agenix/kestractl-env
              | lines
              | where {($in | str trim | str length) > 0}
              | parse "{key}={value}"
              | update value {str trim -c '"'}
              | transpose -r -d
              | load-env
          }
      '';

      configFile.text = ''
        # Aliases
        alias .. = cd ..
        alias ... = cd ...
        alias h = cd $env.HOME
        alias b = yazi
        alias lt = eza --tree --level=2 --long --icons --git
        alias grep = rg
        alias just = just --unstable

        alias node = bun
        alias npx = bunx

        alias n = nix
        alias nd = nix develop -c $nu.current-shell
        alias ns = nix shell
        alias nsn = nix shell nixpkgs#
        alias nb = nix build
        alias nbn = nix build nixpkgs#
        alias nf = nix flake

        alias nr = sudo nixos-rebuild --flake .
        alias nrs = sudo nixos-rebuild switch --flake .#(sys host | get hostname)
        alias snr = sudo nixos-rebuild --flake .
        alias snrs = sudo nixos-rebuild --flake . switch
        alias hm = home-manager --flake .
        alias hms = home-manager --flake . switch
        alias hmr = do { cd ~/projects/nix-configurations; nix flake lock --update-input dotfiles; home-manager --flake .#(whoami)@(hostname) switch }

        alias tsu = sudo tailscale up
        alias tsd = sudo tailscale down

        alias vi = nvim
        alias vim = nvim

        if (which tv | is-not-empty) {
          mkdir ($nu.data-dir | path join "vendor/autoload")
          tv init nu | save -f ($nu.data-dir | path join "vendor/autoload/tv.nu")
        }
      '';
    };
  };
}
