package internal

import (
	"errors"
	"fmt"

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

// EnsureDNSProvider ensures a DNS provider is chosen.
func EnsureDNSProvider() error {
	if DNSProvider == "" && !NoInput {
		prompt := &survey.Select{
			Message: "Select DNS provider",
			Options: []string{"gandi"},
		}

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

	if DNSProvider == "" {
		return fmt.Errorf("missing DNS provider?")
	}

	return nil
}

// EnsureDNSTypeFlag ensures a DNS type flag is present.
func EnsureDNSTypeFlag(c *cli.Context) error {
	if DNSType == "" && !NoInput {
		prompt := &survey.Input{
			Message: "Specify DNS record type",
			Default: "A",
		}
		if err := survey.AskOne(prompt, &DNSType); err != nil {
			return err
		}
	}

	if DNSType == "" {
		ShowSubcommandHelpAndError(c, errors.New("no record type provided"))
	}

	return nil
}

// EnsureDNSNameFlag ensures a DNS name flag is present.
func EnsureDNSNameFlag(c *cli.Context) error {
	if DNSName == "" && !NoInput {
		prompt := &survey.Input{
			Message: "Specify DNS record name",
			Default: "mysubdomain",
		}
		if err := survey.AskOne(prompt, &DNSName); err != nil {
			return err
		}
	}

	if DNSName == "" {
		ShowSubcommandHelpAndError(c, errors.New("no record name provided"))
	}

	return nil
}

// EnsureDNSValueFlag ensures a DNS value flag is present.
func EnsureDNSValueFlag(c *cli.Context) error {
	if DNSValue == "" && !NoInput {
		prompt := &survey.Input{
			Message: "Specify DNS record value",
			Default: "192.168.1.2",
		}
		if err := survey.AskOne(prompt, &DNSValue); err != nil {
			return err
		}
	}

	if DNSName == "" {
		ShowSubcommandHelpAndError(c, errors.New("no record value provided"))
	}

	return nil
}

// EnsureZoneArgument ensures a zone argument is present.
func EnsureZoneArgument(c *cli.Context) (string, error) {
	var zone string
	if c.Args().First() == "" && !NoInput {
		prompt := &survey.Input{
			Message: "Specify a domain name zone",
			Default: "example.com",
		}
		if err := survey.AskOne(prompt, &zone); err != nil {
			return zone, err
		}
	}

	if zone == "" {
		ShowSubcommandHelpAndError(c, errors.New("no zone value provided"))
	}

	return zone, nil
}