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

with lib;

let
  cfg = config.programs.ion;

  aliasesStr = concatStringsSep "\n"
    (mapAttrsToList (k: v: "alias ${k} = ${escapeShellArg v}")
      cfg.shellAliases);
in {
  meta.maintainers = [ maintainers.jo1gi ];

  options.programs.ion = {
    enable = mkEnableOption "the Ion Shell. Compatible with Redox and Linux";

    package = mkOption {
      type = types.package;
      default = pkgs.ion;
      defaultText = literalExpression "pkgs.ion";
      description = ''
        The ion package to install. May be used to change the version.
      '';
    };

    initExtra = mkOption {
      type = types.lines;
      default = "";
      description = ''
        Ion script which is called during ion initialization.
      '';
    };

    shellAliases = mkOption {
      type = with types; attrsOf str;
      default = { };
      example = literalExpression ''
        {
          g = "git";
        }
      '';
      description = ''
        An attribute set that maps aliases (the top level attribute names
        in this option) to command strings or directly to build outputs.
      '';
    };
  };

  config = mkIf cfg.enable {
    home.packages = [ cfg.package ];

    xdg.configFile."ion/initrc".text = ''
      # Aliases
      ${aliasesStr}

      ${cfg.initExtra}
    '';
  };
}