package spec

import (
	"os"

	"forge.cadoles.com/Cadoles/emissary/internal/client"
	agentFlag "forge.cadoles.com/Cadoles/emissary/internal/command/api/agent/flag"
	"forge.cadoles.com/Cadoles/emissary/internal/command/api/apierr"
	clientFlag "forge.cadoles.com/Cadoles/emissary/internal/command/api/flag"
	"forge.cadoles.com/Cadoles/emissary/internal/format"
	"forge.cadoles.com/Cadoles/emissary/internal/spec"
	"github.com/pkg/errors"
	"github.com/urfave/cli/v2"
)

func DeleteCommand() *cli.Command {
	return &cli.Command{
		Name:  "delete",
		Usage: "Delete spec",

		Flags: agentFlag.WithAgentFlags(
			&cli.StringFlag{
				Name:  "spec-name",
				Usage: "use `NAME` as specification's name",
			},
		),
		Action: func(ctx *cli.Context) error {
			baseFlags := clientFlag.GetBaseFlags(ctx)

			token, err := clientFlag.GetToken(baseFlags)
			if err != nil {
				return errors.WithStack(apierr.Wrap(err))
			}

			agentID, err := agentFlag.AssertAgentID(ctx)
			if err != nil {
				return errors.WithStack(err)
			}

			specName, err := assertSpecName(ctx)
			if err != nil {
				return errors.WithStack(err)
			}

			client := client.New(baseFlags.ServerURL, client.WithToken(token))

			specName, err = client.DeleteAgentSpec(ctx.Context, agentID, specName)
			if err != nil {
				return errors.WithStack(apierr.Wrap(err))
			}

			hints := format.Hints{
				OutputMode: baseFlags.OutputMode,
			}

			if err := format.Write(baseFlags.Format, os.Stdout, hints, struct {
				Name spec.Name `json:"name"`
			}{
				Name: specName,
			}); err != nil {
				return errors.WithStack(err)
			}

			return nil
		},
	}
}