package generator

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"
	"text/template"

	tfjson "github.com/hashicorp/terraform-json"
	"github.com/iancoleman/strcase"
)

type namedBlock struct {
	filePattern    string
	typeNamePrefix string
	name           string
	block          *tfjson.SchemaBlock
}

func (b *namedBlock) FieldName() string {
	return b.camelName()
}

func (b *namedBlock) TypeBase() []string {
	return []string{b.typeNamePrefix, b.camelName()}
}

func (b *namedBlock) TypeName() string {
	return strings.Join(b.TypeBase(), "")
}

func (b *namedBlock) TerraformName() string {
	return b.name
}

func (b *namedBlock) normalizedName() string {
	return normalizeName(b.name)
}

func (b *namedBlock) camelName() string {
	return strcase.ToCamel(b.normalizedName())
}

func (b *namedBlock) Generate(path string) error {
	w, err := walk(b.block, []string{b.typeNamePrefix, b.camelName()})
	if err != nil {
		return err
	}

	f, err := os.Create(filepath.Join(path, fmt.Sprintf(b.filePattern, b.normalizedName())))
	if err != nil {
		return err
	}

	defer f.Close()

	tmpl := template.Must(template.ParseFiles("./templates/block.go.tmpl"))
	return tmpl.Execute(f, w)
}