{ lib, pkgs, ... }:

{
  programs.ssh = {
    enable = true;
    compression = true;

    matchBlocks = {
      "giugl.io" = {
        user = "root";
        identityFile = "~/.ssh/architectproxy";
      };

      "192.35.222.32" = {
        user = "giulio";
        identityFile = "~/.ssh/ucsb";
      };

      "tommy.devs.giugl.io" = {
        user = "giulio";
        identityFile = "~/.ssh/tommypc";
      };

      "dodino.devs.giugl.io" = {
        user = "pi";
        identityFile = "~/.ssh/dodino";
      };

      "pepos.devs.giugl.io" = {
        user = "pepos";
        identityFile = "~/.ssh/pepos";
      };

      "bastion.nms.kcl.ac.uk" = {
        user = "k1804704";
        identityFile = "~/.ssh/kcllabs";
      };

      "s2access" = {
        hostname = "s2lab-access.nms.kcl.ac.uk";
        user = "k1804704";
        identityFile = "~/.ssh/kcllabs";
        proxyJump = "bastion.nms.kcl.ac.uk";
      };

      "kcl-mtl-features" = {
        hostname = "134.219.148.11";
        user = "peperunas";
        port = 30330;
        identityFile = "~/.ssh/kcl-mtl";
      };

      "kcl-mtl-deeplearning" = {
        hostname = "134.219.148.11";
        user = "peperunas";
        port = 30332;
        identityFile = "~/.ssh/kcl-mtl";
      };

      "aws-kcl" = {
        hostname = "ssh0-eu-west-2.nms.kcl.ac.uk";
        user = "k1804704";
        identityFile = "~/.ssh/kcllabs";
      };

      "ctf.mhackeroni.it" = {
        user = "root";
        identityFile = "~/.ssh/github";
      };

      "hotpottino.devs.giugl.io" = {
        user = "pi";
        identityFile = "~/.ssh/hotpottino";
      };

      "gbeast.devs.giugl.io" = {
        user = "giulio";
        identityFile = "~/.ssh/gbeast";
        forwardX11 = true;
      };

      "ctf.pnc.giugl.io" = {
        hostname = "s2lab.isg.rhul.ac.uk";
        user = "peperunas";
        port = 38022;
        identityFile = "~/.ssh/rhul_infrastructure";
      };

      "padulino.devs.giugl.io" = {
        user = "giulio";
        identityFile = "~/.ssh/padulino";
      };

      "ssh.dev.azure.com" = {
        user = "git";
        identityFile = "~/.ssh/freta";
      };

      "peppiniell.devs.giugl.io" = {
        user = "giulio";
        identityFile = "~/.ssh/peppiniell";
      };

      "broccolino.devs.giugl.io" = {
        user = "pi";
        port = 5541;
        identityFile = "~/.ssh/broccoli";
      };

      "secloud-node-8" = {
        user = "giulio";
        identityFile = "~/.ssh/secloud-node-8";
      };

      "git.seclab.cs.ucsb.edu" = {
        user = "peperunas";
        identityFile = "~/.ssh/ucsb";
      };

      "architect.devs.giugl.io" = {
        user = "giulio";
        identityFile = "~/.ssh/giupi";
        forwardAgent = true;
      };

      "architect.devs.giugl.io.boot" = {
        hostname = "architect.devs.giugl.io";
        user = "root";
        identityFile = "~/.ssh/giupi";
      };

      "git.giugl.io" = {
        user = "gitea";
        port = 22;
        identityFile = "~/.ssh/gitea";
        identitiesOnly = true;
      };

      "github.com" = {
        user = "git";
        identityFile = "~/.ssh/github";
      };
      
      "code.iti.illinois.edu" = {
        user = "gitlab";
        identityFile = "~/.ssh/github";
      };

      "git.ctf.necst.it" = {
        user = "ctf";
        identityFile = "~/.ssh/gitlab_necst";
      };

      "manduria.devs.giugl.io" = {
        user = "giulio";
        identityFile = "~/.ssh/imacmanduria";
      };

      "bitbucket.org" = { identityFile = "~/.ssh/bitbucket"; };

      "the.al" = {
        user = "git";
        port = 17002;
        identityFile = "~/.ssh/alain";
      };

      "ironman.local.necst.it" = {
        user = "peperunas";
        identityFile = "~/.ssh/ironman";
      };

      "aur.archlinux.org" = {
        user = "aur";
        identityFile = "~/.ssh/aur";
      };

      "ucsb-workstation.devs.giugl.io" = {
        user = "giulio";
        identityFile = "~/.ssh/ucsb";
        forwardAgent = true;
      };
    };

    extraConfig = ''
      IdentitiesOnly yes
      ServerAliveInterval 3600
    '' + lib.optionalString pkgs.stdenv.isDarwin ''
      AddKeysToAgent yes
      UseKeychain yes
      TCPKeepAlive no
    '';
  };
}