package codegen

import (
	"context"
	"fmt"
	"strings"

	"cuelang.org/go/cue"
	"github.com/dave/dst/dstutil"
	"github.com/grafana/codejen"
	"github.com/grafana/cog"
)

type GoSpecJenny struct {
	ApplyFuncs []dstutil.ApplyFunc
}

func (jenny *GoSpecJenny) JennyName() string {
	return "GoResourceTypes"
}

func (jenny *GoSpecJenny) Generate(sfg ...SchemaForGen) (codejen.Files, error) {
	files := make(codejen.Files, len(sfg))

	for i, v := range sfg {
		packageName := strings.ToLower(v.Name)
		cueValue := v.CueFile.LookupPath(cue.ParsePath("lineage.schemas[0].schema.spec"))

		b, err := cog.TypesFromSchema().
			CUEValue(packageName, cueValue, cog.ForceEnvelope("Spec")).
			Golang(cog.GoConfig{}).
			Run(context.Background())
		if err != nil {
			return nil, err
		}

		files[i] = *codejen.NewFile(fmt.Sprintf("pkg/kinds/%s/%s_spec_gen.go", packageName, packageName), b[0].Data, jenny)
	}

	return files, nil
}
