{
  config,
  lib,
  ...
}:
with lib; let
  cfg = config.custom.programs.git;
in {
  options.custom.programs.git = {
    enable = mkOption {default = false;};
  };

  config = mkIf cfg.enable {
    home-manager.sharedModules = [
      {
        # https://git-scm.com
        # https://wiki.nixos.org/wiki/Git
        # https://wiki.archlinux.org/title/Git
        programs.git = {
          enable = true;
          userName = "Myned";
          userEmail = "dev@${config.custom.domain}";

          # BUG: GitHub Desktop tries to enable if this is not in gitconfig
          lfs.enable = true; # Large File Storage

          signing = {
            # TODO: Use ssh signing
            format = "openpgp";
            signByDefault = true;
            key = "C7224454F7881A34";
          };

          # https://git-scm.com/docs/git-config
          # https://git-scm.com/book/en/v2/
          # https://jvns.ca/blog/2024/02/16/popular-git-config-options/
          extraConfig = {
            # https://git-scm.com/docs/git-config#Documentation/git-config.txt-alias
            #?? git ALIAS
            alias = {
              # https://wiki.archlinux.org/title/Git#Visual_representation
              graph = "log --graph --oneline --decorate";
            };

            diff = {
              # https://git-scm.com/docs/git-config#Documentation/git-config.txt-codediffalgorithmcode
              algorithm = "histogram";

              # https://git-scm.com/docs/git-config#Documentation/git-config.txt-codediffcolorMovedcode
              colorMoved = true;
            };

            # https://git-scm.com/docs/git-config#Documentation/git-config.txt-fetchprune
            fetch.prune = true;

            # https://git-scm.com/docs/git-config#Documentation/git-config.txt-formatsignOff
            #?? Signed-off-by: USERNAME <EMAIL>
            format.signOff = true;

            # https://git-scm.com/docs/git-config#Documentation/git-config.txt-helpautoCorrect
            help.autoCorrect = "prompt";

            # https://git-scm.com/docs/git-config#Documentation/git-config.txt-codeinitdefaultBranchcode
            init.defaultBranch = "master"; # owo

            # https://git-scm.com/docs/git-config#Documentation/git-config.txt-mergeconflictStyle
            merge.conflictStyle = "zdiff3";

            # https://git-scm.com/docs/git-config#Documentation/git-config.txt-pullrebase
            pull.rebase = true;

            # https://git-scm.com/docs/git-config#Documentation/git-config.txt-pushautoSetupRemote
            push.autoSetupRemote = true;

            # https://git-scm.com/docs/git-rebase
            rebase = {
              # https://git-scm.com/docs/git-config#Documentation/git-config.txt-rebaseautoSquash
              autoSquash = true;

              # https://git-scm.com/docs/git-config#Documentation/git-config.txt-rebaseautoStash
              autoStash = true;
            };

            # https://git-scm.com/docs/git-config#Documentation/git-config.txt-rerereenabled
            rerere.enabled = true; # reuse recovered resolution

            # https://git-scm.com/docs/git-config#Documentation/git-config.txt-submodulerecurse
            submodule.recurse = true;

            # https://git-scm.com/docs/git-config#Documentation/git-config.txt-transferfsckObjects
            transfer.fsckObjects = true;
          };
        };
      }
    ];
  };
}