{
  pkgs,
  config,
  lib,
  ...
}:
with lib; let
  cfg = config.eboskma.programs.git;
in {
  options.eboskma.programs.git = {
    enable = mkEnableOption "enable git";

    name = mkOption {
      description = "your name";
      type = types.nonEmptyStr;
    };

    email = mkOption {
      description = "your e-mail address";
      type = types.nonEmptyStr;
    };

    signingKey = mkOption {
      description = "your GPG signing key ID";
      type = types.nullOr types.str;
      default = null;
    };
  };

  config = mkIf (cfg.enable) {
    programs.git = {
      enable = true;
      userName = cfg.name;
      userEmail = cfg.email;
      signing = mkIf (cfg.signingKey != null) {
        key = cfg.signingKey;
        signByDefault = true;
      };

      delta = {
        enable = true;
        options = {
          side-by-side = true;
        };
      };

      aliases = {
        ls = "ls-files";
        ignored = "ls-files -o -i --exclude-standard";
        st = "status -s -b";
        branches = "branch -a";
        tags = "tag";
        stashes = "stash list";
        nevermind = "!git reset --hard HEAD && git clean -d -f";
        graph = "log --graph -10 --branches --remotes --tags --format=format:'%Cgreen%h %Creset• %<(75,trunc)%s (%cN, %cr) %Cred%d' --date-order";
        precommit = "diff --cached --diff-algorithm=minimal -w";
        track = "branch -u";
        stat = "status -s";
        up = "pull --autostash --rebase";
        cm = "commit -m";
        changelog = "log --oneline --no-merges";
        source = "remote get-url origin";
      };

      extraConfig = {
        credential.helper = "${pkgs.git.override {withLibsecret = true;}}/bin/git-credential-libsecret";
        init = {
          defaultBranch = "main";
        };
        core = {
          editor = "${pkgs.neovim}/bin/nvim";
          # pager = "${pkgs.bat}/bin/bat";
        };
        merge = {
          ff = "only";
          conflictstyle = "diff3";
          tool = "${pkgs.meld}/bin/meld";
        };
        pull = {
          ff = "only";
        };
        rebase = {
          autoStash = true;
        };
        color = {
          ui = "auto";
          status = {
            added = "yellow";
            changed = "green";
            untracked = "cyan";
          };
          branch = {
            current = "yellow reverse";
            local = "yellow";
            remote = "green";
          };
          diff = {
            meta = "yellow bold";
            frag = "magenta bold";
            old = "red bold";
            new = "green bold";
          };
        };
        grep = {
          lineNumber = true;
          column = true;
          patternType = "extended";
        };
      };
    };

    programs.gh = {
      enable = true;
      settings = {
        git_protocol = "ssh";
        editor = "nvim";
        prompt = "enabled";
        pager = "bat";
        http_unix_socket = "";
        browser = "";
      };
    };
  };
}