package common

import (
	"context"
	"time"

	v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"

	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/pkg/k8s"

	"github.com/tidbcloud/chaos-provider/controllers/chaos/task"
)

type CRDTask struct {
	*task.BaseTask
}

func NewCRD(ctx *task.Context) *CRDTask {
	return &CRDTask{
		BaseTask: &task.BaseTask{Context: ctx},
	}
}

func (c *CRDTask) Name() string {
	return "CRD"
}

func (c *CRDTask) Delete(ctx context.Context) deploy.Result {
	cli, err := c.Remote.GetClient(ctx)
	if err != nil {
		return deploy.Error(err)
	}

	crds := &v1.CustomResourceDefinitionList{}
	if err := cli.List(ctx, crds); err != nil {
		return deploy.Error(err)
	}

	for _, crd := range crds.Items {
		if crd.Spec.Group == "chaos-mesh.org" {
			if err := k8s.DeleteObject(ctx, cli, &crd); err != nil {
				return deploy.Error(err)
			}
		}
	}

	return deploy.Done()
}

func (c *CRDTask) PostDelete(ctx context.Context) deploy.Result {
	cli, err := c.Remote.GetClient(ctx)
	if err != nil {
		return deploy.Error(err)
	}

	crds := &v1.CustomResourceDefinitionList{}
	if err := cli.List(ctx, crds); err != nil {
		return deploy.Error(err)
	}

	for _, crd := range crds.Items {
		if crd.Spec.Group == "chaos-mesh.org" {
			c.Logger.Info("Chaos Mesh CRD is not empty, requeue after 1 second")
			return deploy.Panic(nil).WithRequeuAfter(time.Second)
		}
	}

	return deploy.Done()
}
