{ pkgs, ... }:

let
  bensIp = "68.107.97.20"; # hiddor-kahih
  benKey =  "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCiNB0iF9ClawNEizBtdYucqp1tAXXRbqvlPS6PFRrtiwSl+SJD29BCLgA5rLxcmFhBHZ/iId/En7GPFEzI/gMu071J7pUI4OcW0UVZju3GNc6ZEz/a6AD2u79JiXEDHfPEdmMqAe36kkaK0KJWSQP3xsFRwJ+8F8HHbSwoCLL+GJhBgAWHQLGfKesNrDacNljNDU3CgkEnDmu8QKuSzH2k1vrr69q2u2iMSAdiStDBAWEjN5nCVrm2XB2vmFLMtXpX2n8JI+znOGzRRDc8dNXejQeDMZGyV6jfVidEIX7vdgSydGjTRKcCLVAsKY3z0gYBZ8u8EUNujgcFBnnAvytj ben@neb";
  ibbPort = "3000";
  fathomPort = "3030";
  gitDir = "/srv/git";
in
{
  nixpkgs.config.allowUnfree = true;
  nixpkgs.overlays = [
    (import ../../pack/overlay.nix)
  ];

  networking.firewall.allowedTCPPorts = [ 22 80 443 ];

  services = {

    gitolite = {
      enable = true;
      enableGitAnnex = true;
      dataDir = "${gitDir}";
      user = "git";
      group = "git";
      extraGitoliteRc = ''
        $RC{SITE_INFO} = 'a computer is a bicycle for the mind.';
        $RC{GIT_CONFIG_KEYS} = 'gitweb\.(owner|description|category)';
      '';
      adminPubkey = "${benKey}";
    };
    lighttpd = {
      enable = true;
      port = 8000;
      document-root = "/srv/www";
      mod_userdir = true;
      mod_status = true;
      collectd = {
        enable = true;
      };
      cgit = {
        # disable cgit for now; the ssh interface still works anyway.
        enable = false;
        subdir = "git";
        configText = ''
          cache-size=0
          clone-url=git@simatime.com:$CGIT_REPO_URL
          enable-index-owner=1
          enable-http-clone=0
          enable-index-links=1
          enable-commit-graph=1
          enable-log-filecount=1
          enable-log-linecount=1
          enable-git-config=1
          remove-suffix=1
          branch-sort=age
          max-stats=week
          mimetype.gif=image/gif
          mimetype.html=text/html
          mimetype.jpg=image/jpeg
          mimetype.jpeg=image/jpeg
          mimetype.pdf=application/pdf
          mimetype.png=image/png
          mimetype.svg=image/svg+xml
          about-filter=${pkgs.cgit}/lib/cgit/filters/about-formatting.sh
          source-filter=${pkgs.cgit}/lib/cgit/filters/syntax-highlighting.py
          readme=:README.md
          root-title=simatime git repository
          root-desc=a computer is a bicycle for the mind.
          project-list=${gitDir}/projects.list
          scan-path=${gitDir}/repositories
        '';
      };
    };

    ibb = {
      enable = true;
      port = ibbPort;
    };

    fathom = {
      enable = true;
      port = fathomPort;
      dataDir = "/var/lib/fathom";
    };

    nginx = {
      enable = true;
      recommendedGzipSettings = true;
      recommendedOptimisation = true;
      recommendedProxySettings = true;
      recommendedTlsSettings = true;
      virtualHosts = {
        "web.simatime.com".locations."/".proxyPass = "http://${bensIp}:8000";
        "dev.simatime.com".locations."/".proxyPass = "http://${bensIp}:${ibbPort}";
        "hero.simatime.com".locations."/".proxyPass = "http://${bensIp}:3001";
        "tv.simatime.com".locations."/".proxyPass = "http://${bensIp}:8096"; # emby runs on port 8096

        "notebook.simatime.com".locations = {
          "/" = {
            proxyPass = "http://${bensIp}:3099";
            proxyWebsockets = true;
            extraConfig = ''
              proxy_buffering off;
              proxy_read_timeout 86400;

            '';
          };
          "/(api/kernels/[^/]+/channels|terminals/websocket)/" = {
            proxyPass = "http://${bensIp}:3099";
            proxyWebsockets = true;
          };
        };
        "stats.simatime.com" = {
          locations."/".proxyPass = "http://localhost:${fathomPort}";
          forceSSL = true;
          enableACME = true;
        };
        "influencedbybooks.com" = {
          forceSSL = true;
          enableACME = true;
          locations = {
            "/" = {
              proxyPass = "http://localhost:${ibbPort}";
            };
          };
        };
      };
    };

    znc = {
      enable = true;
      mutable = true;
      useLegacyConfig = false;
      openFirewall = true;
      config = {
        LoadModule = [ "adminlog" "fail2ban" ];
        User.bsima = {
          Admin = true;
          Nick = "bsima";
          AltNick = "bsima1";
          LoadModule = [ "chansaver" "controlpanel" ];
          Network.freenode = { Server = "chat.freenode.net +6697";
            LoadModule = [ "simple_away" "nickserv" ];
            Chan = {
              "#ai"           = {};
              "#bsima"        = {};
              "#emacs"        = {};
              "#haskell"      = {};
              "#haskell-miso" = {};
              "#home-manager" = {};
              "#nixos"        = {};
              "#servant"      = {};
              "#sr.ht"        = {};
              "#xmonad"       = {};
            };
          };
          Pass.password = {
            Method = "sha256";
            Hash = "4a6703074c713a26d56a906fc9ea82bb591177f10a25a650719266bf588d9525";
            Salt = "QByO-A:4Rbib;dl_3wEH";
          };
        };
      };
    };
  };

  mailserver = {
    enable = true;
    monitoring = {
      enable = true;
      alertAddress = "ben@bsima.me";
    };
    fqdn = "mail.simatime.com";
    domains = [ "simatime.com" ];
    certificateScheme = 3; # let's encrypt
    enableImap = true;
    enablePop3 = true;
    enableImapSsl = true;
    enablePop3Ssl = true;
    enableManageSieve = true;
    virusScanning = false; # ur on ur own

    loginAccounts = {
      "ben@simatime.com" = {
        hashedPassword = "$6$Xr180W0PqprtaFB0$9S/Ug1Yz11CaWO7UdVJxQLZWfRUE3/rarB0driXkXALugEeQDLIjG2STGQBLU23//JtK3Mz8Kwsvg1/Zo0vD2/";
        aliases = [
          # admin stuff
          "postmaster@simatime.com"
          "abuse@simatime.com"
        ];
        catchAll = [ "simatime.com" ];
        quota = "1G";
      };
      "nick@simatime.com" = {
        hashedPassword = "$6$31P/Mg8k8Pezy1e$Fn1tDyssf.1EgxmLYFsQpSq6RP4wbEvP/UlBlXQhyKA9FnmFtJteXsbJM1naa8Kyylo8vZM9zmeoSthHS1slA1";
        aliases = [
          "nicolai@simatime.com"
        ];
        quota = "1G";
      };
    };
  };

  virtualisation = {
    libvirtd.enable = true;
    docker.enable = true;
    virtualbox.guest.enable = true;
    virtualbox.host.enable = true;
    virtualbox.host.headless = false;
    virtualbox.host.addNetworkInterface = true;

  };

  boot.cleanTmpDir = true;
  networking.hostName = "simatime";
  networking.firewall.allowPing = true;
  services.openssh.enable = true;
  users.users.root.openssh.authorizedKeys.keys = [ benKey ];
}