package v1

import (
	"context"

	"k8s.io/apimachinery/pkg/runtime"
	ctrl "sigs.k8s.io/controller-runtime"
	logf "sigs.k8s.io/controller-runtime/pkg/log"
	"sigs.k8s.io/controller-runtime/pkg/webhook"
)

// log is for logging in this package.
var ticdclog = logf.Log.WithName("ticdc-resource")

func (r *TiCDC) setupWebhookWithManager(mgr ctrl.Manager) error {
	return ctrl.NewWebhookManagedBy(mgr).
		For(r).
		Complete()
}

//+kubebuilder:webhook:path=/mutate-cloud-pingcap-com-v1-ticdc,mutating=true,failurePolicy=fail,sideEffects=None,groups=cloud.pingcap.com,resources=ticdcs,verbs=create;update,versions=v1,name=mticdc.kb.io,admissionReviewVersions={v1,v1beta1}

var _ webhook.Defaulter = &TiCDC{}

// Default implements webhook.Defaulter so a webhook will be registered for the type
func (r *TiCDC) Default() {
	ticdclog.Info("default", "name", r.Name)
	if r.Labels == nil {
		r.Labels = map[string]string{}
	}

	var nt Network
	err := webhookClient.Get(context.TODO(), r.GetNetworkRef(), &nt)
	if err != nil {
		networklog.Error(err, "error get network of ticdc, forward to validation")
		return
	}
	// network must have a type label
	r.Labels[ProviderTypeLabel] = nt.Labels[ProviderTypeLabel]
	r.Labels[RegionLabel] = nt.Spec.Region
}

// TODO(yinliang): change verbs to "verbs=create;update;delete" if you want to enable deletion validation.
//+kubebuilder:webhook:path=/validate-cloud-pingcap-com-v1-ticdc,mutating=false,failurePolicy=fail,sideEffects=None,groups=cloud.pingcap.com,resources=ticdcs,verbs=create;update,versions=v1,name=vticdc.kb.io,admissionReviewVersions={v1,v1beta1}

var _ webhook.Validator = &TiCDC{}

// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
func (r *TiCDC) ValidateCreate() error {
	ticdclog.Info("validate create", "name", r.Name)

	// TODO(yinliang): fill in your validation logic upon object creation.
	return nil
}

// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
func (r *TiCDC) ValidateUpdate(old runtime.Object) error {
	ticdclog.Info("validate update", "name", r.Name)

	// TODO(yinliang): fill in your validation logic upon object update.
	return nil
}

// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
func (r *TiCDC) ValidateDelete() error {
	ticdclog.Info("validate delete", "name", r.Name)

	// TODO(yinliang): fill in your validation logic upon object deletion.
	return nil
}
