// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package api

import (
	"context"
	"fmt"
	"go/parser"
	"go/token"
	"os"
	"path/filepath"
	"strings"
	"testing"

	"github.com/google/go-cmp/cmp"
	"golang.org/x/pkgsite/internal/godoc"
)

func TestRenderDoc(t *testing.T) {
	t.Run("examples", func(t *testing.T) {
		testRenderDoc(t, true)
	})
	t.Run("no examples", func(t *testing.T) {
		testRenderDoc(t, false)
	})
}

func testRenderDoc(t *testing.T, examples bool) {
	fset := token.NewFileSet()
	docPkg := godoc.NewPackage(fset, nil)
	for _, file := range []string{"pkg.go", "pkg_test.go"} {
		pf, err := parser.ParseFile(fset, filepath.Join("testdata", file), nil, parser.ParseComments)
		if err != nil {
			t.Fatal(err)
		}
		docPkg.AddFile(pf, true)
	}
	gpkg, err := docPkg.Encode(context.Background())
	if err != nil {
		t.Fatal(err)
	}

	decoded, err := godoc.DecodePackage(gpkg)
	if err != nil {
		t.Fatal(err)
	}

	dpkg, err := decoded.DocPackage("p", &godoc.ModuleInfo{ModulePath: "p", ResolvedVersion: "v1.0.0"})
	if err != nil {
		t.Fatal(err)
	}

	var sb strings.Builder
	check := func(t *testing.T, name string, r renderer) {
		sb.Reset()
		t.Run(name, func(t *testing.T) {
			if err := renderDoc(dpkg, r, examples); err != nil {
				t.Fatal(err)
			}
			got := strings.TrimSpace(sb.String())
			goldenName := name
			if examples {
				goldenName += "-examples"
			}
			goldenFile := filepath.Join("testdata", goldenName+".golden")
			wantBytes, err := os.ReadFile(goldenFile)
			if err != nil {
				t.Fatal(err)
			}
			want := strings.TrimSpace(string(wantBytes))
			if diff := cmp.Diff(want, got); diff != "" {
				t.Errorf("mismatch (-want +got):\n%s", diff)
				fmt.Println(got)
			}
		})
	}

	check(t, "text", newTextRenderer(decoded.Fset, &sb))
	check(t, "markdown", newMarkdownRenderer(decoded.Fset, &sb))
	check(t, "html", newHTMLRenderer(decoded.Fset, &sb))
}
