// Copyright 2019 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 cmd

import (
	"context"
	"flag"
	"fmt"

	"golang.org/x/tools/internal/tool"
)

const (
	// The set of possible options that can be passed through the -emulate flag,
	// which causes query to adjust its output to match that of the binary being
	// emulated.

	// emulateGuru tells query to emulate the output format of the guru tool.
	emulateGuru = "guru"
)

// query implements the query command.
type query struct {
	JSON              bool   `flag:"json" help:"emit output in JSON format"`
	MarkdownSupported bool   `flag:"markdown" help:"support markdown in responses"`
	Emulate           string `flag:"emulate" help:"compatibility mode, causes gopls to emulate another tool.\nvalues depend on the operation being performed"`

	app *Application
}

func (q *query) Name() string  { return "query" }
func (q *query) Usage() string { return "<mode> <mode args>" }
func (q *query) ShortHelp() string {
	return "answer queries about go source code"
}
func (q *query) DetailedHelp(f *flag.FlagSet) {
	fmt.Fprint(f.Output(), `
The mode argument determines the query to perform:
`)
	for _, m := range q.modes() {
		fmt.Fprintf(f.Output(), "  %s : %v\n", m.Name(), m.ShortHelp())
	}
	fmt.Fprint(f.Output(), `
query flags are:
`)
	f.PrintDefaults()
}

// Run takes the args after command flag processing, and invokes the correct
// query mode as specified by the first argument.
func (q *query) Run(ctx context.Context, args ...string) error {
	if len(args) == 0 {
		return tool.CommandLineErrorf("query must be supplied a mode")
	}
	mode, args := args[0], args[1:]
	for _, m := range q.modes() {
		if m.Name() == mode {
			return tool.Run(ctx, m, args) // pass errors up the chain
		}
	}
	return tool.CommandLineErrorf("unknown command %v", mode)
}

// modes returns the set of modes supported by the query command.
func (q *query) modes() []tool.Application {
	return []tool.Application{
		&definition{query: q},
	}
}
