// Copyright 2021 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 frontend

import (
	"context"
	"math/rand"
	"net/http"
)

// searchTip represents a snippet of text on the homepage demonstrating
// how to effectively use pkg.go.dev search.
type searchTip struct {
	Text     string
	Example1 string
	Example2 string
}

var searchTips = []searchTip{
	{
		"Search for a package, for example",
		"http",
		"command",
	},
	{
		"Search for a symbol, for example",
		"Unmarshal",
		"io.Reader",
	},
	{
		"Search for symbols within a package using the # filter. For example",
		"golang.org/x #error",
		"#reader io",
	},
}

// Homepage contains fields used in rendering the homepage template.
type homepage struct {
	basePage

	// TipIndex is the index of the initial search tip to render.
	TipIndex int

	// SearchTips is a collection of search tips to show on the homepage.
	SearchTips []searchTip

	// LocalModules holds locally-hosted modules, for quick navigation.
	// Empty in production.
	LocalModules []LocalModule
}

// LocalModule holds information about a locally-hosted module.
//
// JSON-compatible with `go list` output.
type LocalModule struct {
	ModulePath string `json:"Path"`
	Dir        string `json:"Dir"`
}

func (s *Server) serveHomepage(ctx context.Context, w http.ResponseWriter, r *http.Request) {
	s.servePage(ctx, w, "homepage", homepage{
		basePage:     s.newBasePage(r, "Go Packages"),
		SearchTips:   searchTips,
		TipIndex:     rand.Intn(len(searchTips)),
		LocalModules: s.localModules,
	})
}
