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: `
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>gemini://sombodys.site/a/page</id>
  <link href="gemini://sombodys.site/a/page"/>
  <title>This is a gemlog page</title>
  <subtitle>with a subtitle after empty lines</subtitle>
  <updated>2023-08-25T12:00:00Z</updated>
  <entry>
    <id>./first-post.gmi</id>
    <link rel="alternate" href="./first-post.gmi"/>
    <title>This is my first post</title>
    <updated>2023-08-25T12:00:00Z</updated>
  </entry>
</feed>
`[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 := `
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>gemini://127.0.0.1/foo.gmi.atom</id>
  <link href="gemini://127.0.0.1/foo.gmi.atom"/>
  <title>This is my gemini page</title>
  <subtitle>a subtitle</subtitle>
  <updated>2023-06-02T12:00:00Z</updated>
  <entry>
    <id>./first-post.gmi</id>
    <link rel="alternate" href="./first-post.gmi"/>
    <title>My first post</title>
    <updated>2023-05-17T12:00:00Z</updated>
  </entry>
  <entry>
    <id>./second-post.gmi</id>
    <link rel="alternate" href="./second-post.gmi"/>
    <title>second-ever post</title>
    <updated>2023-06-02T12:00:00Z</updated>
  </entry>
</feed>
`[1:]
	if string(result) != target {
		fmt.Println(target)
		fmt.Println(string(result))
		t.Fatal("response body")
	}
}