package record

import (
	"fmt"
	"strconv"

	abraFormatter "coopcloud.tech/abra/cli/formatter"
	"coopcloud.tech/abra/cli/internal"
	gandiPkg "coopcloud.tech/abra/pkg/dns/gandi"
	"github.com/AlecAivazis/survey/v2"
	"github.com/libdns/gandi"
	"github.com/libdns/libdns"
	"github.com/sirupsen/logrus"
	"github.com/urfave/cli/v2"
)

// RecordRemoveCommand lists domains.
var RecordRemoveCommand = &cli.Command{
	Name:      "remove",
	Usage:     "Remove a domain name record",
	Aliases:   []string{"rm"},
	ArgsUsage: "<zone>",
	Flags: []cli.Flag{
		internal.DNSProviderFlag,
		internal.DNSTypeFlag,
		internal.DNSNameFlag,
	},
	Description: `
This command removes a domain name record for a specific zone.

It uses the type of record and name to match existing records and choose one
for deletion. You must specify a zone (e.g. example.com) under which your
domain name records are listed. This zone must already be created on your
provider account.

Example:

    abra record remove foo.com -p gandi -t A -n myapp

You may also invoke this command in "wizard" mode and be prompted for input

    abra record rm
`,
	Action: func(c *cli.Context) error {
		zone, err := internal.EnsureZoneArgument(c)
		if err != nil {
			logrus.Fatal(err)
		}

		if err := internal.EnsureDNSProvider(); err != nil {
			logrus.Fatal(err)
		}

		var provider gandi.Provider
		switch internal.DNSProvider {
		case "gandi":
			provider, err = gandiPkg.New()
			if err != nil {
				logrus.Fatal(err)
			}
		default:
			logrus.Fatalf("'%s' is not a supported DNS provider", internal.DNSProvider)
		}

		if err := internal.EnsureDNSTypeFlag(c); err != nil {
			logrus.Fatal(err)
		}

		if err := internal.EnsureDNSNameFlag(c); err != nil {
			logrus.Fatal(err)
		}

		records, err := provider.GetRecords(c.Context, zone)
		if err != nil {
			logrus.Fatal(err)
		}

		var toDelete libdns.Record
		for _, record := range records {
			if record.Type == internal.DNSType && record.Name == internal.DNSName {
				toDelete = record
				break
			}
		}

		if (libdns.Record{}) == toDelete {
			logrus.Fatal("provider library reports no matching record?")
		}

		tableCol := []string{"type", "name", "value", "TTL", "priority"}
		table := abraFormatter.CreateTable(tableCol)

		value := toDelete.Value
		if len(toDelete.Value) > 30 {
			value = fmt.Sprintf("%s...", toDelete.Value[:30])
		}

		table.Append([]string{
			toDelete.Type,
			toDelete.Name,
			value,
			toDelete.TTL.String(),
			strconv.Itoa(toDelete.Priority),
		})

		table.Render()

		response := false
		prompt := &survey.Confirm{
			Message: "continue with record deletion?",
		}

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

		if !response {
			logrus.Fatal("exiting as requested")
		}

		_, err = provider.DeleteRecords(c.Context, zone, []libdns.Record{toDelete})
		if err != nil {
			logrus.Fatal(err)
		}

		logrus.Info("record successfully deleted")

		return nil
	},
}