package eks

import (
	"context"
	"fmt"

	"github.com/crossplane-contrib/provider-aws/apis/ec2/v1beta1"
	eksv1beta1 "github.com/crossplane-contrib/provider-aws/apis/eks/v1beta1"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/types"

	apierrors "k8s.io/apimachinery/pkg/api/errors"

	"github.com/tidbcloud/eks-provider/controllers/network/task"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/pkg/k8s"
	"github.com/tidbcloud/infra-provider/pkg/namer"
)

type AddressCleanup struct {
	*task.BaseTask
}

func NewAddressCleanup(ctx *task.Context) *AddressCleanup {
	return &AddressCleanup{BaseTask: &task.BaseTask{Context: ctx}}
}

var _ deploy.Task = &AddressCleanup{}

func (t *AddressCleanup) Name() string {
	return "AddressCleanup"
}

func (t *AddressCleanup) Delete(ctx context.Context) deploy.Result {
	key := types.NamespacedName{
		Name: namer.LegacyBuildClusterNameByNetwork(t.Network),
	}
	var c eksv1beta1.Cluster
	err := t.Local.Get(ctx, key, &c)
	if !apierrors.IsNotFound(err) {
		return deploy.Error(fmt.Errorf("Wait eks cluster deleted"))
	}

	name := namer.UniqueIdentifier(t.Network.ObjectMeta)

	zones, err := t.Config.FindRegionZones(t.Network.Spec.Region)
	if err != nil {
		return deploy.Panic(err)
	}

	for i := 0; i < len(zones); i++ {
		zone := zones[i]

		ip := &v1beta1.Address{
			ObjectMeta: metav1.ObjectMeta{
				Name: namer.PublicSubnetName(name, zone),
			},
		}
		err = k8s.DeleteObject(ctx, t.Local, ip)
		if err != nil {
			return deploy.Error(err)
		}
	}

	return deploy.Done()
}
