import ./make-test-python.nix (
  { lib, pkgs, ... }:
  let

    v2rayUser = {
      # A random UUID.
      id = "a6a46834-2150-45f8-8364-0f6f6ab32384";
      alterId = 0; # Non-zero support will be disabled in the future.
    };

    # 1080 [http proxy] -> 1081 [vmess] -> direct
    v2rayConfig = {
      inbounds = [
        {
          tag = "http_in";
          port = 1080;
          listen = "127.0.0.1";
          protocol = "http";
        }
        {
          tag = "vmess_in";
          port = 1081;
          listen = "127.0.0.1";
          protocol = "vmess";
          settings.clients = [ v2rayUser ];
        }
      ];
      outbounds = [
        {
          tag = "vmess_out";
          protocol = "vmess";
          settings.vnext = [
            {
              address = "127.0.0.1";
              port = 1081;
              users = [ v2rayUser ];
            }
          ];
        }
        {
          tag = "direct";
          protocol = "freedom";
        }
      ];
      routing.rules = [
        {
          type = "field";
          inboundTag = "http_in";
          outboundTag = "vmess_out";
        }
        {
          type = "field";
          inboundTag = "vmess_in";
          outboundTag = "direct";
        }

        # Assert assets "geoip" and "geosite" are accessible.
        {
          type = "field";
          ip = [ "geoip:private" ];
          domain = [ "geosite:category-ads" ];
          outboundTag = "direct";
        }
      ];
    };

  in
  {
    name = "v2ray";
    meta = with lib.maintainers; {
      maintainers = [ servalcatty ];
    };
    nodes.machine =
      { pkgs, ... }:
      {
        environment.systemPackages = [ pkgs.curl ];
        services.v2ray = {
          enable = true;
          config = v2rayConfig;
        };
        services.httpd = {
          enable = true;
          adminAddr = "foo@example.org";
        };
      };

    testScript = ''
      start_all()

      machine.wait_for_unit("httpd.service")
      machine.wait_for_unit("v2ray.service")
      machine.wait_for_open_port(80)
      machine.wait_for_open_port(1080)
      machine.succeed(
          "curl --fail --max-time 10 --proxy http://localhost:1080 http://localhost"
      )
    '';
  }
)