package cmd

import (
	"fmt"
	"sort"

	"github.com/golang/glog"
	"github.com/spf13/cobra"
	"k8s.io/client-go/pkg/api/errors"
	"k8s.io/client-go/pkg/api/v1"

	"github.com/ksonnet/kubecfg/utils"
)

const (
	flagGracePeriod = "grace-period"
)

func init() {
	RootCmd.AddCommand(deleteCmd)
	deleteCmd.PersistentFlags().Int64(flagGracePeriod, -1, "Number of seconds given to resources to terminate gracefully. A negative value is ignored")
}

var deleteCmd = &cobra.Command{
	Use:   "delete",
	Short: "Delete Kubernetes resources described in local config",
	RunE: func(cmd *cobra.Command, args []string) error {
		flags := cmd.Flags()
		boolFalse := false

		gracePeriod, err := flags.GetInt64(flagGracePeriod)
		if err != nil {
			return err
		}

		objs, err := readObjs(cmd, args)
		if err != nil {
			return err
		}

		clientpool, disco, err := restClientPool(cmd)
		if err != nil {
			return err
		}

		defaultNs, _, err := clientConfig.Namespace()
		if err != nil {
			return err
		}

		sort.Sort(sort.Reverse(utils.DependencyOrder(objs)))

		deleteOpts := v1.DeleteOptions{OrphanDependents: &boolFalse}
		if gracePeriod >= 0 {
			deleteOpts.GracePeriodSeconds = &gracePeriod
		}

		for _, obj := range objs {
			desc := fmt.Sprintf("%s/%s", obj.GetKind(), fqName(obj))
			glog.Info("Deleting ", desc)

			c, err := clientForResource(clientpool, disco, obj, defaultNs)
			if err != nil {
				return err
			}

			err = c.Delete(obj.GetName(), &deleteOpts)
			if err != nil && !errors.IsNotFound(err) {
				return fmt.Errorf("Error deleting %s: %s", desc, err)
			}

			glog.V(2).Info("Deleted object: ", obj)
		}

		return nil
	},
}