# Credits to raf, his flake is in the README.md
{
  config,
  lib,
  ...
}: let
  inherit (builtins) map;
  inherit (config.modules.other.system) username;
  hmCfg = config.home-manager.users.${username};

  inherit (lib.strings) concatStrings;
in {
  home-manager.users.${username} = let
    elemsConcatted = concatStrings (
      map (s: "\$${s}") [
        "hostname"
        "username"
        "directory"
        "shell"
        "nix_shell"
        "git_branch"
        "git_commit"
        "git_state"
        "git_status"
        "jobs"
        "cmd_duration"
      ]
    );
  in {
    home.sessionVariables = {
      STARSHIP_CACHE = "${hmCfg.home.homeDirectory}/.cache/starship";
    };
    programs.starship = {
      enable = true;
      enableFishIntegration = true;
      enableTransience = true;
      settings = {
        scan_timeout = 2;
        command_timeout = 2000; # nixpkgs makes starship implode with lower values
        add_newline = false;
        line_break.disabled = false;

        format = "${elemsConcatted}\n$character";

        hostname = {
          ssh_only = true;
          disabled = false;
          format = "@[$hostname](bold blue) "; # the whitespace at the end is actually important
        };

        # configure specific elements
        character = {
          error_symbol = "[](bold red)";
          success_symbol = "[](bold green)";
          vicmd_symbol = "[](bold yellow)";
          format = "$symbol [|](bold bright-black) ";
        };

        username = {
          format = "[$user]($style) in ";
        };

        directory = {
          truncation_length = 2;

          # removes the read_only symbol from the format, it doesn't play nicely with my folder icon
          format = "[ ](bold green) [$path]($style) ";

          # the following removes tildes from the path, and substitutes some folders with shorter names
          substitutions = {
            "~/Dev" = "Dev";
            "~/Documents" = "Docs";
          };
        };

        # git
        git_commit.commit_hash_length = 7;
        git_branch.style = "bold purple";
        git_status = {
          style = "red";
          ahead = "⇡ ";
          behind = "⇣ ";
          conflicted = " ";
          renamed = "»";
          deleted = "✘ ";
          diverged = "⇆ ";
          modified = "!";
          stashed = "≡";
          staged = "+";
          untracked = "?";
        };

        # language configurations
        # the whitespaces at the end *are* necessary for proper formatting
        lua.symbol = "[ ](blue) ";
        python.symbol = "[ ](blue) ";
        rust.symbol = "[ ](red) ";
        nix_shell.symbol = "[󱄅 ](blue) ";
        golang.symbol = "[󰟓 ](blue)";
        c.symbol = "[ ](black)";
        nodejs.symbol = "[󰎙 ](yellow)";

        package.symbol = "📦 ";
      };
    };
  };
}
