package atomconv
import (
	"bytes"
	"context"
	"fmt"
	"io"
	"net/url"
	"testing"
	"tildegit.org/tjp/sliderule"
	"tildegit.org/tjp/sliderule/gemini"
	"tildegit.org/tjp/sliderule/gemini/gemtext"
	"tildegit.org/tjp/sliderule/internal/types"
)
func TestConvert(t *testing.T) {
	tests := []struct {
		url    string
		input  string
		output string
	}{
		{
			url: "gemini://sombodys.site/a/page",
			input: `
# This is a gemlog page
## with a subtitle after empty lines
=> ./first-post.gmi 2023-08-25 - This is my first post
`[1:],
			output: `
  gemini://sombodys.site/a/page
  
  This is a gemlog page
  with a subtitle after empty lines
  2023-08-25T12:00:00Z
  
    ./first-post.gmi
    
    This is my first post
    2023-08-25T12:00:00Z
  
`[1:],
		},
	}
	for _, test := range tests {
		t.Run(test.url, func(t *testing.T) {
			doc, err := gemtext.Parse(bytes.NewBufferString(test.input))
			if err != nil {
				t.Fatal(err)
			}
			loc, err := url.Parse(test.url)
			if err != nil {
				t.Fatal(err)
			}
			out := &bytes.Buffer{}
			if err := Convert(out, doc, loc); err != nil {
				t.Fatal(err)
			}
			if out.String() != test.output {
				t.Fatal("mismatched output")
			}
		})
	}
}
func TestAuto(t *testing.T) {
	rout := &sliderule.Router{}
	rout.Route("/foo.gmi", types.HandlerFunc(func(ctx context.Context, request *types.Request) *types.Response {
		return gemini.Success("text/gemini", bytes.NewBufferString(`
# This is my gemini page
## a subtitle
=> ./first-post.gmi 2023-05-17 - My first post
=> ./second-post.gmi 2023-06-02 second-ever post
`[1:]))
	}))
	rout.Route("/bar.gmi", types.HandlerFunc(func(ctx context.Context, request *types.Request) *types.Response {
		return gemini.Success("text/gemini", bytes.NewBufferString(`
# Another homepage
=> ./first-post.gmi 2023-05-17 - first post
=> ./second-post.gmi 2023-06-02 second post
`[1:]))
	}))
	h := Auto(rout.Handler())
	response := h.Handle(context.Background(), &types.Request{URL: &url.URL{
		Scheme: "gemini",
		Host:   "127.0.0.1",
		Path:   "/foo.gmi.atom",
	}})
	if response.Status != gemini.StatusSuccess {
		t.Fatal("bad response code")
	}
	result, err := io.ReadAll(response.Body)
	if err != nil {
		t.Fatal(err)
	}
	target := `
  gemini://127.0.0.1/foo.gmi.atom
  
  This is my gemini page
  a subtitle
  2023-06-02T12:00:00Z
  
    ./first-post.gmi
    
    My first post
    2023-05-17T12:00:00Z
  
  
    ./second-post.gmi
    
    second-ever post
    2023-06-02T12:00:00Z
  
`[1:]
	if string(result) != target {
		fmt.Println(target)
		fmt.Println(string(result))
		t.Fatal("response body")
	}
}