package http

import (
	"errors"
	"net"
	"net/http"
	"os/exec"
	"testing"

	"github.com/apernet/hysteria/core/client"
)

const (
	testCertFile = "test.crt"
	testKeyFile  = "test.key"
)

type mockEchoHyClient struct{}

func (c *mockEchoHyClient) DialTCP(addr string) (net.Conn, error) {
	return net.Dial("tcp", addr)
}

func (c *mockEchoHyClient) ListenUDP() (client.HyUDPConn, error) {
	// Not implemented
	return nil, errors.New("not implemented")
}

func (c *mockEchoHyClient) Close() error {
	return nil
}

func TestServer(t *testing.T) {
	// Start the server
	s := &Server{
		HyClient: &mockEchoHyClient{},
	}
	l, err := net.Listen("tcp", "127.0.0.1:18080")
	if err != nil {
		t.Fatal(err)
	}
	defer l.Close()
	go s.Serve(l)

	// Start a test HTTP & HTTPS server
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("control is an illusion"))
	})
	go http.ListenAndServe("127.0.0.1:18081", nil)
	go http.ListenAndServeTLS("127.0.0.1:18082", testCertFile, testKeyFile, nil)

	// Run the Python test script
	cmd := exec.Command("python", "server_test.py")
	out, err := cmd.CombinedOutput()
	if err != nil {
		t.Fatalf("Failed to run test script: %v\n%s", err, out)
	}
}