import ./make-test-python.nix (
  { pkgs, ... }:
  {
    name = "mihomo";
    meta.maintainers = with pkgs.lib.maintainers; [ Guanran928 ];

    nodes.machine = {
      environment.systemPackages = [ pkgs.curl ];

      services.nginx = {
        enable = true;
        statusPage = true;
      };

      services.mihomo = {
        enable = true;
        configFile = pkgs.writeTextFile {
          name = "config.yaml";
          text = ''
            mixed-port: 7890
            external-controller: 127.0.0.1:9090
            authentication:
            - "user:supersecret"
          '';
        };
      };
    };

    testScript = ''
      # Wait until it starts
      machine.wait_for_unit("nginx.service")
      machine.wait_for_unit("mihomo.service")
      machine.wait_for_open_port(80)
      machine.wait_for_open_port(7890)
      machine.wait_for_open_port(9090)

      # Proxy
      machine.succeed("curl --fail --max-time 10 --proxy http://user:supersecret@localhost:7890 http://localhost")
      machine.succeed("curl --fail --max-time 10 --proxy socks5://user:supersecret@localhost:7890 http://localhost")
      machine.fail("curl --fail --max-time 10 --proxy http://user:supervillain@localhost:7890 http://localhost")
      machine.fail("curl --fail --max-time 10 --proxy socks5://user:supervillain@localhost:7890 http://localhost")

      # Web UI
      result = machine.succeed("curl --fail http://localhost:9090")
      target = '{"hello":"mihomo"}\n'
      assert result == target, f"{result!r} != {target!r}"
    '';
  }
)
