package gemini_test

import (
	"bytes"
	"context"
	"crypto/tls"
	"fmt"
	"io"
	"net/url"
	"testing"

	"tildegit.org/tjp/gus/gemini"
)

func TestRoundTrip(t *testing.T) {
	tlsConf, err := gemini.FileTLS("./testdata/server.crt", "./testdata/server.key")
	if err != nil {
		t.Fatalf("FileTLS(): %s", err.Error())
	}

	handler := func(ctx context.Context, req *gemini.Request) *gemini.Response {
		return gemini.Success("text/gemini", bytes.NewBufferString("you've found my page"))
	}

	server, err := gemini.NewServer(context.Background(), tlsConf, "tcp", "127.0.0.1:0", handler)
	if err != nil {
		t.Fatalf("NewServer(): %s", err.Error())
	}

	go server.Serve()
	defer server.Close()

	u, err := url.Parse(fmt.Sprintf("gemini://%s/test", server.Address()))
	if err != nil {
		t.Fatalf("url.Parse: %s", err.Error())
	}

	cli := gemini.NewClient(testClientTLS())
	response, err := cli.RoundTrip(&gemini.Request{URL: u})
	if err != nil {
		t.Fatalf("RoundTrip(): %s", err.Error())
	}

	if response.Status != gemini.StatusSuccess {
		t.Errorf("response status: expected %d, got %d", gemini.StatusSuccess, response.Status)
	}
	if response.Meta != "text/gemini" {
		t.Errorf("response meta: expected \"text/gemini\", got %q", response.Meta)
	}

	if response.Body == nil {
		t.Fatal("succcess response has nil body")
	}
	body, err := io.ReadAll(response.Body)
	if err != nil {
		t.Fatalf("ReadAll: %s", err.Error())
	}
	if string(body) != "you've found my page" {
		t.Errorf("response body: expected \"you've found my page\", got %q", string(body))
	}
}

func testClientTLS() *tls.Config {
	return &tls.Config{InsecureSkipVerify: true}
}