package node

import (
	"strconv"
	"testing"

	"github.com/spf13/cobra"
)

func TestEvacuateFlags(t *testing.T) {
	defaults := NewEvacuateOptions(nil)

	tests := map[string]struct {
		flagName   string
		defaultVal string
	}{
		"dry run": {
			flagName:   flagDryRun,
			defaultVal: strconv.FormatBool(defaults.DryRun),
		},
		"force": {
			flagName:   flagForce,
			defaultVal: strconv.FormatBool(defaults.Force),
		},
		"grace period": {
			flagName:   flagGracePeriod,
			defaultVal: strconv.FormatInt(defaults.GracePeriod, 10),
		},
	}

	cmd := NewCommandManageNode(nil, ManageNodeCommandName, ManageNodeCommandName, nil, nil)
	for _, v := range tests {
		testFlag(cmd, v.flagName, v.defaultVal, t)
	}
}

func testFlag(cmd *cobra.Command, flagName string, defaultVal string, t *testing.T) {
	f := cmd.Flag(flagName)
	if f == nil {
		t.Fatalf("expected flag %s to be registered but found none", flagName)
	}

	if f.DefValue != defaultVal {
		t.Errorf("expected default value of %s for %s but found %s", defaultVal, flagName, f.DefValue)
	}
}

func TestEvacOptionsGracePeriod(t *testing.T) {
	opts := &EvacuateOptions{
		GracePeriod: 999,
	}

	// ensure delete options are created correctly
	deleteOptions := opts.makeDeleteOptions()
	if deleteOptions == nil {
		t.Fatalf("nil delete options were created")
	}
	if deleteOptions.GracePeriodSeconds == nil {
		t.Fatalf("delete options did not contain grace period %v", deleteOptions)
	}
	if *deleteOptions.GracePeriodSeconds != opts.GracePeriod {
		t.Errorf("expected %d grace period but found %d", opts.GracePeriod, *deleteOptions.GracePeriodSeconds)
	}
}