package internal

import (
	"fmt"

	"github.com/AlecAivazis/survey/v2"
	"github.com/urfave/cli/v2"
)

// EnsureServerProvider ensures a 3rd party server provider is chosen.
func EnsureServerProvider() error {
	if ServerProvider == "" && !NoInput {
		prompt := &survey.Select{
			Message: "Select server provider",
			Options: []string{"capsul", "hetzner-cloud"},
		}

		if err := survey.AskOne(prompt, &ServerProvider); err != nil {
			return err
		}
	}

	if ServerProvider == "" {
		return fmt.Errorf("missing server provider?")
	}

	return nil
}

// EnsureCapsulNewFlags ensure all flags are present.
func EnsureNewCapsulVPSFlags(c *cli.Context) error {
	if CapsulName == "" && !NoInput {
		prompt := &survey.Input{
			Message: "specify capsul name",
		}
		if err := survey.AskOne(prompt, &CapsulName); err != nil {
			return err
		}
	}

	if CapsulInstanceURL == "" && !NoInput {
		prompt := &survey.Input{
			Message: "specify capsul instance URL",
			Default: "yolo.servers.coop",
		}
		if err := survey.AskOne(prompt, &CapsulInstanceURL); err != nil {
			return err
		}
	}

	if CapsulType == "" && !NoInput {
		prompt := &survey.Input{
			Message: "specify capsul type",
			Default: "f1-xs",
		}
		if err := survey.AskOne(prompt, &CapsulType); err != nil {
			return err
		}
	}

	if CapsulImage == "" && !NoInput {
		prompt := &survey.Input{
			Message: "specify capsul image",
			Default: "debian10",
		}
		if err := survey.AskOne(prompt, &CapsulImage); err != nil {
			return err
		}
	}

	if len(CapsulSSHKeys.Value()) == 0 && !NoInput {
		prompt := &survey.Input{
			Message: "specify capsul SSH keys",
			Default: "me@foo.com,you@bar.com",
		}
		if err := survey.AskOne(prompt, &CapsulSSHKeys); err != nil {
			return err
		}
	}

	if CapsulAPIToken == "" && !NoInput {
		prompt := &survey.Input{
			Message: "specify capsul API token",
		}
		if err := survey.AskOne(prompt, &CapsulAPIToken); err != nil {
			return err
		}
	}

	if CapsulName == "" {
		ShowSubcommandHelpAndError(c, fmt.Errorf("missing capsul name?"))
	}
	if CapsulInstanceURL == "" {
		ShowSubcommandHelpAndError(c, fmt.Errorf("missing capsul instance url?"))
	}
	if CapsulType == "" {
		ShowSubcommandHelpAndError(c, fmt.Errorf("missing capsul type?"))
	}
	if CapsulImage == "" {
		ShowSubcommandHelpAndError(c, fmt.Errorf("missing capsul image?"))
	}
	if len(CapsulSSHKeys.Value()) == 0 {
		ShowSubcommandHelpAndError(c, fmt.Errorf("missing capsul ssh keys?"))
	}
	if CapsulAPIToken == "" {
		ShowSubcommandHelpAndError(c, fmt.Errorf("missing capsul API token?"))
	}

	return nil
}

// EnsureNewHetznerCloudVPSFlags ensure all flags are present.
func EnsureNewHetznerCloudVPSFlags(c *cli.Context) error {
	if HetznerCloudName == "" && !NoInput {
		prompt := &survey.Input{
			Message: "specify hetzner cloud VPS name",
		}
		if err := survey.AskOne(prompt, &HetznerCloudName); err != nil {
			return err
		}
	}

	if HetznerCloudType == "" && !NoInput {
		prompt := &survey.Input{
			Message: "specify hetzner cloud VPS type",
			Default: "cx11",
		}
		if err := survey.AskOne(prompt, &HetznerCloudType); err != nil {
			return err
		}
	}

	if HetznerCloudImage == "" && !NoInput {
		prompt := &survey.Input{
			Message: "specify hetzner cloud VPS image",
			Default: "debian-10",
		}
		if err := survey.AskOne(prompt, &HetznerCloudImage); err != nil {
			return err
		}
	}

	if len(HetznerCloudSSHKeys.Value()) == 0 && !NoInput {
		prompt := &survey.Input{
			Message: "specify hetzner cloud SSH keys",
			Default: "me@foo.com,you@bar.com",
		}
		if err := survey.AskOne(prompt, &HetznerCloudSSHKeys); err != nil {
			return err
		}
	}

	if HetznerCloudLocation == "" && !NoInput {
		prompt := &survey.Input{
			Message: "specify hetzner cloud VPS location",
		}
		if err := survey.AskOne(prompt, &HetznerCloudLocation); err != nil {
			return err
		}
	}

	if HetznerCloudAPIToken == "" && !NoInput {
		prompt := &survey.Input{
			Message: "specify hetzner cloud API token",
		}
		if err := survey.AskOne(prompt, &HetznerCloudAPIToken); err != nil {
			return err
		}
	}

	if HetznerCloudName == "" {
		ShowSubcommandHelpAndError(c, fmt.Errorf("missing hetzner cloud VPS name?"))
	}
	if HetznerCloudType == "" {
		ShowSubcommandHelpAndError(c, fmt.Errorf("missing hetzner cloud VPS type?"))
	}
	if HetznerCloudImage == "" {
		ShowSubcommandHelpAndError(c, fmt.Errorf("missing hetzner cloud image?"))
	}
	if len(HetznerCloudSSHKeys.Value()) == 0 {
		ShowSubcommandHelpAndError(c, fmt.Errorf("missing hetzner cloud ssh keys?"))
	}
	if HetznerCloudLocation == "" {
		ShowSubcommandHelpAndError(c, fmt.Errorf("missing hetzner cloud VPS location?"))
	}
	if HetznerCloudAPIToken == "" {
		ShowSubcommandHelpAndError(c, fmt.Errorf("missing hetzner cloud API token?"))
	}

	return nil
}