package gke

import (
	"context"
	"fmt"

	corev1 "k8s.io/api/core/v1"
	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/consts"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/pkg/k8s"
	"github.com/tidbcloud/infra-provider/pkg/namer"
)

const credentialKey = "privateKey"

type Credential struct {
	*task.BaseTask
}

// NewCredential create Bucket instance.
func NewCredential(ctx *task.Context) *Credential {
	return &Credential{BaseTask: &task.BaseTask{Context: ctx}}
}

var _ deploy.Task = (*Credential)(nil)

// Name implements deploy.Task.Name interface.
func (c *Credential) Name() string {
	return "Credential"
}

func (c *Credential) Create(ctx context.Context) deploy.Result {
	saKeyName := namer.LegacyBuildServiceAccountKeyNameByNetwork(c.Network)
	saKeySecret := corev1.Secret{}
	err := c.Local.Get(ctx, types.NamespacedName{Namespace: c.Network.Namespace, Name: saKeyName}, &saKeySecret)
	if err != nil {
		return deploy.Error(err)
	}

	if saKeySecret.Data[credentialKey] == nil {
		return deploy.Error(fmt.Errorf("serviceaccount %s key data empty", saKeyName))
	}

	secret := &corev1.Secret{
		ObjectMeta: metav1.ObjectMeta{
			Name:      consts.BRGCPSecretName,
			Namespace: consts.LocalOperatorNamespace,
		},
		Data: map[string][]byte{
			consts.BRGCPSecretDataKey: saKeySecret.Data[credentialKey],
		},
		Type: corev1.SecretTypeOpaque,
	}

	cli, err := c.Remote.GetClient(ctx)
	if err != nil {
		return deploy.Error(err)
	}

	if err := k8s.CreateIfNotExist(ctx, cli, secret); err != nil {
		return deploy.Error(fmt.Errorf("create service account key secret in tidb operator namespace failed, %s", err.Error()))
	}

	return deploy.Done()
}
