package urfavecli

import (
	"io"
	"strings"
	"testing"

	"github.com/stretchr/testify/require"
	cli "github.com/urfave/cli/v2"
	"go.skia.org/infra/go/loggingsyncbuffer"
	"go.skia.org/infra/go/sklog/sklogimpl"
	"go.skia.org/infra/go/sklog/stdlogging"
)

type myGeneric struct {
	value string
}

func (m *myGeneric) Set(value string) error {
	m.value = value
	return nil
}

func (m *myGeneric) String() string {
	return m.value
}

func TestLogFlags(t *testing.T) {

	logsBuffer := loggingsyncbuffer.New()

	// Send logs to a buffer.
	sklogimpl.SetLogger(stdlogging.New(logsBuffer))

	commandFlags := []cli.Flag{
		&cli.BoolFlag{
			Name: "boolNotPassedIn",
		},
		&cli.BoolFlag{
			Name: "bool",
		},
		&cli.DurationFlag{
			Name: "duration",
		},
		&cli.Float64Flag{
			Name: "float64",
		},
		&cli.Float64SliceFlag{
			Name: "float64Slice",
		},
		&cli.Int64Flag{
			Name: "int64",
		},
		&cli.Int64SliceFlag{
			Name: "int64Slice",
		},
		&cli.IntFlag{
			Name: "int",
		},
		&cli.IntSliceFlag{
			Name: "intSlice",
		},
		&cli.PathFlag{
			Name: "path",
		},
		&cli.StringFlag{
			Name: "string",
		},
		&cli.StringSliceFlag{
			Name: "stringSlice",
		},
		&cli.Uint64Flag{
			Name: "uint64",
		},
		&cli.UintFlag{
			Name: "uint",
		},
	}
	app := &cli.App{
		Name: "testapp",
		Commands: []*cli.Command{
			{
				Name:  "my-command",
				Flags: commandFlags,
				Action: func(c *cli.Context) error {
					LogFlags(c)
					return nil
				},
			},
		},
	}

	// Don't print anything on stderr/stdout.
	oldHelpPrinter := cli.HelpPrinter
	cli.HelpPrinter = func(_ io.Writer, _ string, _ interface{}) {}
	defer func() {
		cli.HelpPrinter = oldHelpPrinter
	}()

	err := app.Run([]string{
		"testapp",
		"my-command",
		"--bool",
		"--duration=24s",
		"--float64=3.3",
		"--float64Slice=1.1",
		"--float64Slice=2.2",
		"--int64=64",
		"--int64Slice=128",
		"--int64Slice=129",
		"--int64Slice=130",
		"--int=65",
		"--intSlice=138",
		"--intSlice=139",
		"--intSlice=140",
		"--string=string",
		"--stringSlice=a,b,c",
		"--uint64=54",
		"--uint=53",
	})

	require.NoError(t, err)

	fullOutput := logsBuffer.String()
	lines := strings.Split(fullOutput, "\n")
	flagLines := []string{}
	for _, line := range lines {
		if strings.Contains(line, "Flags:") {
			// Strip off everything before Flags: which contains timestamps and
			// other stuff that changes.
			flagLines = append(flagLines, strings.Split(line, "Flags:")[1])
		}
	}

	expected := []string{
		" --help=false",
		" --boolNotPassedIn=false",
		" --bool=true",
		" --duration=24s",
		" --float64=3.3",
		" --float64Slice={[1.1 2.2] true}",
		" --int64=64",
		" --int64Slice={[128 129 130] true}",
		" --int=65",
		" --intSlice={[138 139 140] true}",
		" --path=",
		" --string=string",
		" --stringSlice={[a,b,c] true}",
		" --uint64=54",
		" --uint=53",
		" --help=false",
	}
	require.Equal(t, expected, flagLines)
}
