package api

import (
	"context"
	"errors"
	"go.uber.org/zap"

	"github.com/pingcap/log"
	cloudv1 "github.com/tidbcloud/operationlet/api/v1"
	"sigs.k8s.io/controller-runtime/pkg/client"
	util "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
)

type InfraClient struct {
	client client.Client
}

func NewInfraClient(cli client.Client) *InfraClient {
	return &InfraClient{client: cli}
}

func (i *InfraClient) CreateOperationsCommandJob(ctx context.Context, crd *cloudv1.OperationCommandJob) error {
	log.Info("Create OperationCommandJob CRD!")
	op, err := util.CreateOrUpdate(ctx, i.client, crd, func() error {
		return nil
	})

	if err != nil {
		log.Error("Create OperationCommandJob CRD failed!", zap.Error(err))
		return err
	}

	if op == util.OperationResultNone {
		log.Info("The CRD is existing!")
		return errors.New("crd is existing!")
	}
	return nil
}

func (i *InfraClient) UpdatePhase(ctx context.Context, crd *cloudv1.OperationCommandJob, newStatus cloudv1.CommandJobPhase) error {
	log.Info("Update OperaionCommandJob Phase", zap.String("name", crd.Name),
		zap.String("cluster_id", crd.Spec.ClusterID),
		zap.String("old_status", string(crd.Status.Phase)),
		zap.String("new_status", string(newStatus)),
	)
	err := i.client.Status().Update(ctx, crd)
	if err != nil {
		log.Error("Update OperationCommandJob Phase failed!", zap.Error(err), zap.String("new_status", string(newStatus)))
		return err
	}
	return nil
}
