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

{
  options.modules.fish = {
    enable = lib.mkEnableOption "Fish integration";
    enableDefaultAliases = lib.mkOption {
      type = lib.types.bool;
      default = true;
      description = "Enable default aliases and abbreviations";
    };

    enableStarship = lib.mkOption {
      type = lib.types.bool;
      default = false;
      description = "Enable Starship prompt";
    };

    functions = lib.mkOption {
      type = with lib.types; attrsOf str;
      description = "Fish function definitions";
    };
  };

  config = lib.mkIf config.modules.fish.enable {
    home.packages = with pkgs; [ alacritty ];

    programs.nix-index = {
      enable = true;
      enableFishIntegration = true;
    };

    programs.starship = lib.mkIf config.modules.fish.enableStarship {
      enable = true;
      enableFishIntegration = true;
    };

    programs.fish = {
      enable = true;
      interactiveShellInit = "set fish_greeting";

      shellAliases = lib.mkIf config.modules.fish.enableDefaultAliases {
        ".." = "cd ..";
        "..." = "cd ../..";
        "...." = "cd ../../../";
        "....." = "cd ../../../../";

        "cp" = "cp -v";
        "ddf" = "df -h";
        "etc" = "erd -H";
        "mkdir" = "mkdir -p";
        "mv" = "mv -v";
        "rm" = "rm -v";
        "rr" = "rm -rf";

        "neofetch" = "fastfetch";
      };

      shellAbbrs = lib.mkIf config.modules.fish.enableDefaultAliases {
        gaa = "git add -A";
        ga = "git add";
        gbd = "git branch --delete";
        gb = "git branch";
        gc = "git commit";
        gcm = "git commit -m";
        gcob = "git checkout -b";
        gco = "git checkout";
        gd = "git diff";
        gl = "git log";
        gp = "git push";
        gs = "git status";
      };

      functions = config.modules.fish.functions;
    };
  };
}
