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

let
  userCfg = config.users.foo-dogsquared;
  cfg = userCfg.programs.git;
in
{
  options.users.foo-dogsquared.programs.git = {
    enable = lib.mkEnableOption "foo-dogsquared's Git setup";

    instaweb.enable = lib.mkEnableOption "install additional files for instaweb setup";
  };

  config = lib.mkIf cfg.enable (
    lib.mkMerge [
      {
        home.packages = with pkgs; [
          tea # So you don't have to see some teas, I guess.
          hut # So you don't have to see Sourcehut's brutalist design, I guess.
        ];

        # My Git credentials.
        programs.git = {
          enable = true;
          package = pkgs.gitFull;
          lfs.enable = true;
          signing.key = "4AA9CDFF7C99DFF9";
          extraConfig = {
            core.excludesFile = ../../config/git/ignore;

            user = {
              name = config.accounts.email.accounts.personal.realName;
              email = config.accounts.email.accounts.personal.address;
            };

            alias = {
              unstage = "reset HEAD --";
              quick-rebase = "rebase --interactive --autostash --committer-date-is-author-date";
              quick-clone = "clone --depth=1 --recurse-submodules --shallow-submodules";
            };

            init.defaultBranch = "main";

            # Shorthand for popular forges ala-Nix flake URL inputs. It's just a fun
            # little part of the config.
            url = {
              "https://github.com/".insteadOf = [ "gh:" "github:" ];
              "https://gitlab.com/".insteadOf = [ "gl:" "gitlab:" ];
              "https://gitlab.gnome.org/".insteadOf = [ "gnome:" ];
              "https://invent.kde.org/".insteadOf = [ "kde:" ];
              "https://git.sr.ht/".insteadOf = [ "sh:" "sourcehut:" ];
              "https://git.savannah.nongnu.org/git/".insteadOf = [ "sv:" "savannah:" ];
            };

            pull.rebase = "interactive";

            status = {
              showPatch = true;
              showStash = true;
            };

            submodule.fetchJobs = 0;
          };
        };

        # So you don't have to use GitHub, I guess.
        programs.gh = {
          enable = true;
          extensions = with pkgs; [
            gh-eco
            gh-dash
            gh-actions-cache
          ];

          settings = {
            git_protocol = "ssh";
            prompt = "enabled";

            aliases = {
              pc = "pr checkout";
              pv = "pr view";
            };
          };
        };
      }

      (lib.mkIf cfg.instaweb.enable {
        state.ports.git-instaweb.value = 15432;

        home.packages = with pkgs; [
          lighttpd
        ];

        programs.git.extraConfig.instaweb = {
          local = true;
          httpd = "lighttpd";
          port = config.state.ports.git-instaweb.value;
        };

        users.foo-dogsquared.programs.custom-homepage.sections.quicklinks.links =
          lib.mkBefore (lib.singleton {
            text = "Current git repo";
            url = "http://localhost:${builtins.toString config.state.ports.git-instaweb.value}";
          });
      })
    ]);
}
