// 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 main

import (
	"bytes"
	"strings"
	"testing"

	"golang.org/x/pkgsite/cmd/internal/pkgsite-cli/client"
)

func TestFormatPackage(t *testing.T) {
	var buf bytes.Buffer
	formatPackage(&buf, packageResult{
		Package: &client.Package{
			PackageInfo: client.PackageInfo{
				Path:     "encoding/json",
				Synopsis: "Package json implements encoding and decoding of JSON.",
			},
			ModulePath:        "std",
			Version:           "go1.22.0",
			IsStandardLibrary: true,
			IsLatest:          true,
		},
	})
	out := buf.String()
	for _, want := range []string{
		"encoding/json (standard library)",
		"Module:   std",
		"go1.22.0 (latest)",
		"Package json",
	} {
		if !strings.Contains(out, want) {
			t.Errorf("output missing %q:\n%s", want, out)
		}
	}
}

func TestFormatPackageWithExtras(t *testing.T) {
	var buf bytes.Buffer
	formatPackage(&buf, packageResult{
		Package: &client.Package{
			PackageInfo: client.PackageInfo{
				Path: "github.com/foo/bar",
			},
			ModulePath: "github.com/foo/bar",
			Version:    "v1.0.0",
			Imports:    []string{"fmt", "strings"},
			Licenses:   []client.License{{Types: []string{"MIT"}, FilePath: "LICENSE"}},
		},
		Symbols: &client.PaginatedResponse[client.Symbol]{
			Items: []client.Symbol{
				{Name: "New", Kind: "func", Synopsis: "func New() *Bar"},
			},
			Total: 1,
		},
		ImportedBy: &client.PackageImportedBy{
			ImportedBy: client.PaginatedResponse[string]{
				Items: []string{"github.com/baz/qux"},
				Total: 100,
			},
		},
	})
	out := buf.String()
	for _, want := range []string{
		"Imports:",
		"  fmt",
		"Licenses:",
		"  MIT (LICENSE)",
		"Symbols:",
		"  func New() *Bar",
		"Imported by:",
		"  github.com/baz/qux",
		"Showing 1 of 100",
	} {
		if !strings.Contains(out, want) {
			t.Errorf("output missing %q:\n%s", want, out)
		}
	}
}

func TestFormatModule(t *testing.T) {
	var buf bytes.Buffer
	formatModule(&buf, moduleResult{
		Module: &client.Module{
			Path:              "golang.org/x/text",
			Version:           "v0.14.0",
			IsLatest:          true,
			HasGoMod:          true,
			IsRedistributable: true,
			RepoURL:           "https://github.com/golang/text",
		},
	})
	out := buf.String()
	for _, want := range []string{
		"golang.org/x/text",
		"v0.14.0 (latest)",
		"https://github.com/golang/text",
		"Has go.mod:       yes",
		"Redistributable:  yes",
	} {
		if !strings.Contains(out, want) {
			t.Errorf("output missing %q:\n%s", want, out)
		}
	}
}

func TestFormatModuleWithExtras(t *testing.T) {
	var buf bytes.Buffer
	formatModule(&buf, moduleResult{
		Module: &client.Module{
			Path:    "golang.org/x/text",
			Version: "v0.14.0",
			Readme:  &client.Readme{Filepath: "README.md", Contents: "# text"},
		},
		Versions: &client.PaginatedResponse[client.VersionResponse]{
			Items: []client.VersionResponse{{Version: "v0.14.0"}, {Version: "v0.13.0"}},
			Total: 2,
		},
		Vulns: &client.PaginatedResponse[client.Vulnerability]{
			Items: []client.Vulnerability{{ID: "GO-2023-0001", Summary: "Bad thing", FixedVersion: "v0.14.0"}},
			Total: 1,
		},
		Packages: &client.PaginatedResponse[client.ModulePackageResponse]{
			Items: []client.ModulePackageResponse{{Path: "golang.org/x/text/language", Synopsis: "BCP 47 tags"}},
			Total: 1,
		},
	})
	out := buf.String()
	for _, want := range []string{
		"README (README.md):",
		"# text",
		"Versions:",
		"  v0.14.0",
		"Vulnerabilities:",
		"  GO-2023-0001",
		"    Bad thing",
		"    Fixed in: v0.14.0",
		"Packages:",
		"golang.org/x/text/language",
	} {
		if !strings.Contains(out, want) {
			t.Errorf("output missing %q:\n%s", want, out)
		}
	}
}

func TestFormatSearch(t *testing.T) {
	var buf bytes.Buffer
	formatSearch(&buf, &client.PaginatedResponse[client.SearchResult]{
		Items: []client.SearchResult{{
			PackagePath: "encoding/json",
			ModulePath:  "std",
			Version:     "go1.22.0",
			Synopsis:    "Package json.",
		}},
		Total: 1,
	})
	out := buf.String()
	if !strings.Contains(out, "encoding/json") {
		t.Errorf("output missing package path:\n%s", out)
	}
	if !strings.Contains(out, "std@go1.22.0") {
		t.Errorf("output missing module@version:\n%s", out)
	}
}

func TestFormatSearchEmpty(t *testing.T) {
	var buf bytes.Buffer
	formatSearch(&buf, &client.PaginatedResponse[client.SearchResult]{})
	if !strings.Contains(buf.String(), "No results") {
		t.Errorf("expected 'No results' message, got:\n%s", buf.String())
	}
}
