{ config
, lib
, ...
}:

with lib;
let
  cfg = config.my.programs.git;
in
{
  options.my.programs.git = {
    enable = mkEnableOption "git";
    signing = mkOption {
      default = false;
      type = types.bool;
      example = true;
    };
    identity = {
      name = mkOption {
        default = "Moritz Böhme";
        type = types.str;
      };
      email = mkOption {
        default = "mail@moritzboeh.me";
        type = types.str;
      };
    };
  };

  config = mkIf cfg.enable {
    my.shell.abbreviations = {
      ga = "git add";
      gap = "git add --patch";
      gr = "git restore";
      grp = "git restore --patch";
      gb = "git branch";
      gc = "git commit";
      gco = "git checkout";
      gd = "git diff";
      gds = "git diff --staged";
      gp = "git push";
      gf = "git fetch";
      gF = "git pull";
      gs = "git status";
    };
    home-manager.users.moritz = {
      programs.git = {
        enable = true;
        userName = cfg.identity.name;
        userEmail = cfg.identity.email;
        extraConfig = {
          commit.verbose = true;
          diff.algorithm = "histogram";
          fetch.fsckobjects = true;
          init.defaultBranch = "main";
          merge.conflictstyle = "zdiff3";
          push.autoSetupRemote = true;
          receive.fsckObjects = true;
          transfer.fsckobjects = true;
        };
        signing = mkIf cfg.signing {
          key = "0x970C6E89EB0547A9";
          signByDefault = true;
        };
        lfs.enable = true;
        delta.enable = true;
      };
    };
    programs.git.enable = true;
  };
}
