let
	nixpkgsOptions = {};
	pkgs = (import (fetchTarball "https://github.com/NixOS/nixpkgs-channels/archive/nixos-19.03.tar.gz") nixpkgsOptions);
	pkgs1803 = (import (fetchTarball "https://github.com/NixOS/nixpkgs-channels/archive/nixos-18.03.tar.gz") nixpkgsOptions);
	presets = {
		base = (import ./presets/base.nix);
		kvm = (import ./presets/kvm.nix);
	};
	nginxPresets = {
		php = (import ./presets/nginx/php.nix);
		cphpApplication = (import ./presets/nginx/cphp-application.nix);
	};
in {
	network = {
		inherit pkgs;
		description = "Cryto";
	};

	"machine-haless-03.cryto.net" = { pkgs, lib, config, ... }@args: {
		system.stateVersion = "19.03";

		imports = [
			presets.base
			presets.kvm
			./hardware-configurations/machine-haless-03.nix
		];

		deployment.healthChecks.http = [
			{ scheme = "http"; port = 80; path = "/"; host = "todo.cryto.net"; description = "todo.cryto.net is up"; }
			{ scheme = "http"; port = 80; path = "/"; host = "books.cryto.net"; description = "books.cryto.net is up"; }
			{ scheme = "http"; port = 80; path = "/"; host = "learn.cryto.net"; description = "learn.cryto.net is up"; }
			{ scheme = "http"; port = 80; path = "/"; host = "vps-list.cryto.net"; description = "vps-list.cryto.net is up"; }
		];

		networking.firewall.allowedTCPPorts = [ 80 ];

		services.nginx = {
			enable = true;
			virtualHosts = {
				"haless.cryto.net" = {
					locations."/shadow" = {
						alias = ./sources/shadow-generator;
					};
					locations."/knex-mirror" = {
						alias = ./sources/knex-mirror;
					};
				};
				"books.cryto.net" = lib.mkMerge [
					(nginxPresets.php args) /* Temporary hack until I can figure out the mkMerge evaluation order issue */
					{
						root = pkgs.stdenv.mkDerivation {
							name = "cryto-books";
							src = ./sources/cryto-books;

							installPhase = ''
								mkdir -p $out/
								cp -r $src/* $out/
								cp ${../private/cryto-books/credentials.php} $out/credentials.php
							'';
						};
					}
				];
				"todo.cryto.net" = lib.mkMerge [
					(nginxPresets.php args) /* Temporary hack until I can figure out the mkMerge evaluation order issue */
					(nginxPresets.cphpApplication (pkgs.stdenv.mkDerivation {
						name = "cryto-todo";
						src = ./sources/cryto-todo;

						installPhase = ''
							mkdir -p $out/public_html
							cp -r $src/* $out/public_html
							cp ${../private/cryto-todo/config.json} $out/config.json
						'';
					}))
				];
				"learn.cryto.net" = lib.mkMerge [
					(nginxPresets.php args) /* Temporary hack until I can figure out the mkMerge evaluation order issue */
					(nginxPresets.cphpApplication (pkgs.stdenv.mkDerivation {
						name = "cryto-learn";
						src = ./sources/cryto-learn;

						installPhase = ''
							mkdir -p $out/public_html
							cp -r $src/* $out/public_html
							cp ${../private/cryto-learn/config.json} $out/config.json
						'';
					}))
				];
				"vps-list.cryto.net" = lib.mkMerge [
					(nginxPresets.php args) /* Temporary hack until I can figure out the mkMerge evaluation order issue */
					(nginxPresets.cphpApplication (pkgs.stdenv.mkDerivation {
						name = "vps-list";
						src = ./sources/vps-list;

						installPhase = ''
							mkdir -p $out/public_html
							mkdir -p $out/public_html/cphp

							cp -r $src/* $out/public_html
							cp ${../private/vps-list/config.php} $out/public_html/cphp/config.php
						'';
					}))
				];
			};
		};

		services.mysql = {
			enable = true;
			package = pkgs.mysql55;
		};

		services.phpfpm = {
			extraConfig = ''
				log_level = notice
			'';
			phpPackage = pkgs1803.php56;
			pools = {
				main = {
					listen = "/var/run/phpfpm-main.sock";
					extraConfig = ''
						user = nobody
						listen.owner = nginx
						listen.group = nginx
						listen.mode = 0660

						pm = dynamic
						pm.max_children = 75
						pm.start_servers = 10
						pm.min_spare_servers = 5
						pm.max_spare_servers = 20
						pm.max_requests = 500

						catch_workers_output = yes
					'';
				};
			};
		};
	};
}
