package task

import (
	"context"

	"github.com/tidbcloud/eks-provider/pkg/config"
	"github.com/tidbcloud/eks-provider/pkg/deploy"
	"github.com/tidbcloud/eks-provider/pkg/helm"

	"helm.sh/helm/v3/pkg/chart"
	"helm.sh/helm/v3/pkg/chart/loader"

	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
)

type PCAIssuer struct {
	*BaseTask
	config *PCAIssuerConfig
}

type PCAIssuerConfig struct {
	helmChartPath string
	crdPaths      []string
	image         config.ImageConfig
}

func (c *PCAIssuerConfig) GetNamespace() string {
	return certManagerNamespace
}

func (c *PCAIssuerConfig) GetName() string {
	return "aws-pca-issuer"
}

func (c *PCAIssuerConfig) ToHelmChart() (result *chart.Chart, err error) {
	return loader.Load(c.helmChartPath)
}

func (c *PCAIssuerConfig) ToHelmValues() map[string]interface{} {
	return map[string]interface{}{
		"image": map[string]string{
			"repository": c.image.Repo,
			"tag":        c.image.Tag,
		},
	}
}

func (c *PCAIssuerConfig) GetCRDs() ([]*apiextensionsv1.CustomResourceDefinition, error) {
	var result []*apiextensionsv1.CustomResourceDefinition
	for _, path := range c.crdPaths {
		crd, err := loadCRD(path)
		if err != nil {
			return nil, err
		}
		result = append(result, crd)
	}
	return result, nil
}

func NewPCAIssuer(ctx *Context) *PCAIssuer {
	return &PCAIssuer{
		BaseTask: &BaseTask{Context: ctx},
		config: &PCAIssuerConfig{
			helmChartPath: ctx.Config.Network.PCAIssuer.ChartPath,
			image:         ctx.Config.Network.PCAIssuer.Image,
			crdPaths:      ctx.Config.Network.PCAIssuer.CRDPaths,
		},
	}
}

func (t *PCAIssuer) Name() string {
	return "PCAIssuer"
}

func (t *PCAIssuer) Create(ctx context.Context) deploy.Result {
	if t.remote == nil {
		return deploy.Skip("empty remote client")
	}
	return deploy.FromError(helm.Apply(ctx, t.remote, t.config))
}

func (t *PCAIssuer) PostCreate(ctx context.Context) deploy.Result {
	return deploy.FromError(nil)
}
