package acme

import (
	"bufio"
	"fmt"
	"os"
)

const (
	dnsTemplate = "%s %d IN TXT \"%s\""
)

// DNSProviderManual is an implementation of the ChallengeProvider interface
type DNSProviderManual struct{}

// NewDNSProviderManual returns a DNSProviderManual instance.
func NewDNSProviderManual() (*DNSProviderManual, error) {
	return &DNSProviderManual{}, nil
}

// Present prints instructions for manually creating the TXT record
func (*DNSProviderManual) Present(domain, token, keyAuth string) error {
	fqdn, value, ttl := DNS01Record(domain, keyAuth)
	dnsRecord := fmt.Sprintf(dnsTemplate, fqdn, ttl, value)

	authZone, err := FindZoneByFqdn(fqdn, RecursiveNameservers)
	if err != nil {
		return err
	}

	logf("[INFO] acme: Please create the following TXT record in your %s zone:", authZone)
	logf("[INFO] acme: %s", dnsRecord)
	logf("[INFO] acme: Press 'Enter' when you are done")

	reader := bufio.NewReader(os.Stdin)
	_, _ = reader.ReadString('\n')
	return nil
}

// CleanUp prints instructions for manually removing the TXT record
func (*DNSProviderManual) CleanUp(domain, token, keyAuth string) error {
	fqdn, _, ttl := DNS01Record(domain, keyAuth)
	dnsRecord := fmt.Sprintf(dnsTemplate, fqdn, ttl, "...")

	authZone, err := FindZoneByFqdn(fqdn, RecursiveNameservers)
	if err != nil {
		return err
	}

	logf("[INFO] acme: You can now remove this TXT record from your %s zone:", authZone)
	logf("[INFO] acme: %s", dnsRecord)
	return nil
}