package cmdgroup

import (
	"bytes"
	"testing"

	"github.com/spf13/cobra"
	"github.com/stretchr/testify/require"
)

func TestCommandFlagGrouping(t *testing.T) {
	cmd := &cobra.Command{
		Use:   "test [flags]",
		Short: "test command",
		Run: func(cmd *cobra.Command, args []string) {
			// Do nothing
		},
	}

	parent := &cobra.Command{
		Use: "parent",
	}

	parent.PersistentFlags().String("global", "", "Global flag")
	parent.AddCommand(cmd)

	wrappedCmd := NewCommandWithGroupFlag(cmd)
	jobGroup := NewFlagGroup("Job")
	jobGroup.SetDescription("Description.")
	fs := jobGroup.FlagSet()
	fs.String("job-name", "", "Name of the job")
	fs.String("job-type", "", "Type of the job")
	wrappedCmd.AddFlagGroup(jobGroup)

	pipelineGroup := NewFlagGroup("Pipeline")
	fs = pipelineGroup.FlagSet()
	fs.String("pipeline-name", "", "Name of the pipeline")
	fs.String("pipeline-type", "", "Type of the pipeline")
	wrappedCmd.AddFlagGroup(pipelineGroup)

	cmd.Flags().BoolP("bool", "b", false, "Bool flag")

	buf := bytes.NewBuffer(nil)
	cmd.SetOutput(buf)
	err := cmd.Usage()
	require.NoError(t, err)

	expected := `Usage:
  parent test [flags]

Job Flags:
  Description.
      --job-name string   Name of the job
      --job-type string   Type of the job

Pipeline Flags:
      --pipeline-name string   Name of the pipeline
      --pipeline-type string   Type of the pipeline

Flags:
  -b, --bool   Bool flag

Global Flags:
      --global string   Global flag
`
	require.Equal(t, expected, buf.String())

	require.NotNil(t, cmd.Flags().Lookup("job-name"))
	require.NotNil(t, cmd.Flags().Lookup("job-type"))
	require.NotNil(t, cmd.Flags().Lookup("pipeline-name"))
	require.NotNil(t, cmd.Flags().Lookup("pipeline-type"))
	require.NotNil(t, cmd.Flags().Lookup("bool"))
}