package got

import (
	"text/template"

	. "git.eugeniocarvalho.dev/eugeniucarvalho/apicodegen/common"
	G "github.com/dave/jennifer/jen"
)

var (
	getStmtsTmpl *template.Template
	getStmtsErr  error
)

func init() {

	getStmtsTmpl, getStmtsErr = ParseTemplate(`
	var (
		entity = &models.{{.entity}}{}
		values = ctx.Values()
	)
	values.Set("entity", entity)

	options := values.Get("$filter").(*api.Filter)
	options.DB = "{{.dbName}}"
	options.Collection = "{{.collectionName}}"
	options.Entity = entity

	if err = t.Fields(options); err != nil {
		return
	}
	
	{{if .preconditions}}
		if _, err = executeAction(
			ctx,
			{{.preconditions}},
		); err != nil {
			return
		}
	{{end}}

	if _, err = models.Api.FindOne(options); err != nil {
		return
	}
	
	{{if .beforeResponse}}
	if resp, err = executeAction(
		ctx,
		{{.beforeResponse}},
	); err != nil || resp != nil {
		return
	}
	{{end}}
	resp = entity
	return`)

	if getStmtsErr != nil {
		panic(getStmtsErr)
	}
}

var (
	GenGetStmtsOne = &Middleware{
		Id:   "get_one",
		Type: "method",
		Fn: func(ctx *MiddlewareContext) error {
			var (
				project        = ctx.Project
				method         = ctx.Method
				dbName         = project.GetEntityDB(method.Entity)
				collectionName = project.GetCollection(method.Entity)
				context        = map[string]interface{}{
					"dbName":         dbName,
					"collectionName": collectionName,
					"entity":         method.Entity,
					"beforeFind":     method.Hook("beforeFind"),
					"beforeSend":     method.Hook("beforeSend"),
					"preconditions":  parseMethodActions(method.Preconditions),
					"beforeResponse": parseMethodActions(method.BeforeResponse),
				}
			)

			// Nome do metodo que verifica se a entidade tem dependencias
			out, _ := TemplateToString(getStmtsTmpl, context)
			ctx.Statement.Block(G.Id(out)).Line()

			return nil
		},
	}
)
