package gke

import (
	"context"
	"fmt"

	"github.com/crossplane-contrib/provider-gcp/apis/compute/v1beta1"
	"github.com/pingcap/errors"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/types"

	"github.com/tidbcloud/eks-provider/controllers/network/task"

	"github.com/tidbcloud/infra-provider/pkg/cloud/gcp"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/pkg/k8s"
	"github.com/tidbcloud/infra-provider/pkg/namer"
)

type SubnetworkCleanUp struct {
	*task.BaseTask
	gcpCli gcp.Client
}

func NewSubnetworkCleanUp(ctx *task.Context, gcpCli gcp.Client) *SubnetworkCleanUp {
	return &SubnetworkCleanUp{
		BaseTask: &task.BaseTask{Context: ctx},
		gcpCli:   gcpCli,
	}
}

var _ deploy.Task = &VPC{}

// Name implements Task interface.
func (t *SubnetworkCleanUp) Name() string {
	return "SubnetworkCleanUp"
}

// Delete implements Task interface.
func (t *SubnetworkCleanUp) Delete(ctx context.Context) deploy.Result {
	name := namer.UniqueIdentifier(t.Network.ObjectMeta)
	subnetName := fmt.Sprintf("%s-nodes", name)

	if err := t.gcpCli.DeleteAllPSCEndpoints(ctx, t.GKENetworkSpec.ProjectID, t.Network.Spec.Region, name, subnetName); err != nil {
		return deploy.Error(errors.Annotate(err, "failed to delete all psc endpoints"))
	}

	// delete subnet
	subnet := &v1beta1.Subnetwork{
		ObjectMeta: metav1.ObjectMeta{
			Name: subnetName,
		},
	}
	err := k8s.DeleteObject(ctx, t.Local, subnet)
	if err != nil {
		return deploy.Error(err)
	}

	err = k8s.GetDeletedObject(ctx, t.Local, types.NamespacedName{
		Name: subnetName,
	}, subnet)

	return deploy.ErrorOrDone(err)

}
