package cluster

import (
	"context"
	"errors"
	"fmt"

	"braces.dev/errtrace"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"

	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/repository"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/service/serverless"
)

const cleanPageSize = 100

func (svc *service) CleanClusters(ctx context.Context, organizationId uint64) error {
	ctx, span := serverless.Tracer.Start(ctx, "ClusterService.CleanClusters")
	defer span.End()

	if organizationId == 0 {
		return errtrace.Wrap(errors.New("organization id is invalid"))
	}

	// First get clusters  from database
	filter := &repository.ClusterFilter{
		OrganizationIds: []uint64{organizationId},
		DeployType:      entity.DeployTypeServerless,
	}

	var pageIndex = 0

	for {
		clusters, err := svc.clusterRepo.QueryClusterByFilterAndPage(ctx,
			filter,
			pageIndex*cleanPageSize,
			cleanPageSize,
		)
		if err != nil {
			return fmt.Errorf("list cluster in database failed: %w", err)
		}

		if len(clusters) == 0 {
			break
		}

		// delete cluster
		for _, cluster := range clusters {
			if cluster.OrganizationId != organizationId {
				err := fmt.Errorf("cluster not belong to this organization")
				tilog.Error(
					ctx,
					err.Error(),
					zap.Any("“cluster", cluster),
					zap.Uint64("organization id", organizationId),
				)
				return err
			}
			_, _, err := svc.DeleteCluster(ctx, cluster.ClusterId)
			if err != nil {
				tilog.Warn(ctx, "delete cluster failed", zap.Uint64("cluster_id", cluster.ClusterId), zap.Error(err))
				return err
			}
		}
		pageIndex++
	}
	return nil
}
