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

let
  rangerGit = pkgs.ranger.overrideAttrs (old: {
    version = "git";
    src = pkgs.fetchFromGitHub {
      owner = "ranger";
      repo = "ranger";
      rev = "c7777d558d5b69843b21f986e9af1af311c83887";
      hash = "sha256-DTVoEfc4dAaBTDLFujvWIYj5KHL89YknUiinIs9Rkeg=";
    };
    propagatedBuildInputs = with pkgs.python3Packages; [
      # required for test suite, it's being ran during package build for some reason
      flake8
      pylint
      pytest
      setuptools
    ] ++ old.propagatedBuildInputs;
  });
  aliasDrag = pkgs.writeScriptBin "drag" ''
    ${unstablePkgs.ripdrag}/bin/ripdrag -Axd $@
  '';
in
{
  imports = [
    ./unstable-packages.nix
  ];
  environment.systemPackages = with pkgs; [
    aliasDrag
    rangerGit
    kitty
    zoxide
  ];

  programs.bash.shellInit = ''
    HISTCONTROL=ignoreboth
  '';

  programs.bash.interactiveShellInit = ''
    HISTCONTROL=ignoreboth
    if test -n "$KITTY_INSTALLATION_DIR"; then
      export KITTY_SHELL_INTEGRATION="enabled,no-sudo"
      source "$KITTY_INSTALLATION_DIR/shell-integration/bash/kitty.bash"
    fi
    eval "''$(zoxide init bash)"
    alias bye=exit
  '';

  environment.etc."xdg/kitty/kitty.conf".text = ''
    font_family MesloLGS Nerd Font
    font_size 10.0
    scrollback_lines 10000
    window_border_width 0.5
    window_padding_width 3
    ${if config.services.xserver.desktopManager.gnome.enable then "hide_window_decorations yes" else ""}
    background_opacity 0.8
    dynamic_background_opacity yes

    map kitty_mod+alt+c copy_ansi_to_clipboard
  '';

  environment.etc."ranger/rc.conf".text = ''
    eval import os; fm.set_option_from_string("preview_images", "true") if "KITTY_INSTALLATION_DIR" in os.environ else None;
    eval import os; fm.set_option_from_string("preview_images_method", "kitty") if "KITTY_INSTALLATION_DIR" in os.environ else None;
    set vcs_aware true
    set show_hidden true

    alias drag shell ${unstablePkgs.ripdrag}/bin/ripdrag -Axd %p &
    map <C-d> drag
  '';

  environment.etc."ranger/plugins/zoxide.py".source = pkgs.fetchFromGitHub {
    owner = "jchook";
    repo = "ranger-zoxide";
    rev = "281828de060299f73fe0b02fcabf4f2f2bd78ab3";
    hash = "sha256-JEuyYSVa1NS3aftezEJx/k19lwwzf7XhqBCL0jH6VT4=";
  } + /__init__.py;

  programs.direnv.enable = true;

  programs.neovim = {
    enable = true;
    viAlias = true;
    vimAlias = true;
    configure = {
      customRC = ''
        set number
        set hlsearch
        set incsearch
        set tabstop=4
        set softtabstop=4
        set shiftwidth=4
        set expandtab
        set autoindent
        set updatetime=500

        syntax on
        set encoding=utf-8
        set wildmode=longest,list,full
        set listchars=space:·,tab:┄┄»
        set indentkeys-=0#

        " rainbow-delimeters-nvim
        let g:rainbow_delimiters = {
          \ 'strategy': {
            \ ${"''"}: rainbow_delimiters#strategy.global,
          \ },
        \ }

        " vim-gitguter
        set signcolumn=yes
        highlight SignColumn ctermbg=NONE
        highlight GitGutterAdd ctermfg=2
        highlight GitGutterChange ctermfg=4
        highlight GitGutterDelete ctermfg=1

        lua require('guess-indent').setup {}
      '';
      packages.myVimPackage = with pkgs.vimPlugins; {
        start = [
          guess-indent-nvim
          vim-visual-multi
          autoclose-nvim
          rainbow-delimiters-nvim
          vimagit
          vim-gitgutter
        ];
      };
    };
  };

  environment.variables = lib.mkIf config.programs.neovim.enable rec {
    EDITOR = "/run/current-system/sw/bin/nvim";
    VISUAL = EDITOR;
  };

  programs.starship = {
    enable = true;
    settings = {
      format = "$all$line_break\${custom.ranger}$jobs$battery$time$status$os$container$shell$character";
      directory = {
        truncation_length = 5;
        truncation_symbol = "…/";
      };
      hostname = {
        ssh_only = false;
      };
      username = {
        show_always = true;
      };
      status.disabled = false;
      custom.ranger = {
        when = "test $RANGER_LEVEL";
        command = "echo \"✦\"";
        style = "bold 208";
      };
    };
  };
}