package main

import (
	"context"

	"github.com/spf13/cobra"
	"go.skia.org/infra/gold-client/go/goldclient"
)

// dumpEnv provides the environment for the dump command.
type dumpEnv struct {
	flagDumpHashes   bool
	flagDumpBaseline bool

	flagWorkDir string
}

// getDumpCmd returns the definition of the dump command.
func getDumpCmd() *cobra.Command {
	env := &dumpEnv{}
	cmd := &cobra.Command{
		Use:   "dump",
		Short: "Output information about the tests/images",
		Long: `
Output information such as the baselines and known hashes
that have been downloaded from the server.

Only has output after goldctl imgtest init or goldctl imgtest add
has been run.
`,
		Run: env.runDumpCmd,
	}

	cmd.Flags().BoolVar(&env.flagDumpHashes, "hashes", false, "Dump the (potentially long) list of hashes that have been seen before.")
	cmd.Flags().BoolVar(&env.flagDumpBaseline, "baseline", true, "Dump the baseline.")

	// add the workdir flag and make it required
	cmd.Flags().StringVar(&env.flagWorkDir, fstrWorkDir, "", "Work directory for intermediate results")
	must(cmd.MarkFlagRequired(fstrWorkDir))

	return cmd
}

func (d *dumpEnv) runDumpCmd(cmd *cobra.Command, _ []string) {
	ctx := cmd.Context()
	d.Dump(ctx)
}

// Dump executes the dump logic - it loads the work dir from disk and dumps out the information.
func (d *dumpEnv) Dump(ctx context.Context) {
	ctx = loadAuthenticatedClients(ctx, d.flagWorkDir)

	// the user is presumed to have called init first, so we can just load it
	goldClient, err := goldclient.LoadCloudClient(d.flagWorkDir)
	ifErrLogExit(ctx, err)

	if d.flagDumpBaseline {
		b, err := goldClient.DumpBaseline()
		ifErrLogExit(ctx, err)
		logInfof(ctx, "Baseline:\n%s\n", b)
	}

	if d.flagDumpHashes {
		h, err := goldClient.DumpKnownHashes()
		ifErrLogExit(ctx, err)
		logInfof(ctx, "Known Hashes:\n%s\n", h)
	}
	exitProcess(ctx, 0)
}
