package got

import (
	"text/template"

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

var (
	pipeStmtsTmpl *template.Template
	pipeStmtsErr  error
)

func init() {

	pipeStmtsTmpl, pipeStmtsErr = ParseTemplate(`
	{{if .preconditions}}
		if resp, err = executeAction(
			ctx,
			{{.preconditions}},
		); err != nil {
			return
		}
	{{end}}
	return`)

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

var (
	GenPipeStmts = &Middleware{
		Id:   "post",
		Type: "method",
		Fn: func(ctx *MiddlewareContext) error {

			var (
				method  = ctx.Method
				context = map[string]interface{}{
					"preconditions": parseMethodActions(method.Preconditions),
				}
			)
			// Nome do metodo que verifica se a entidade tem dependencias
			out, _ := TemplateToString(pipeStmtsTmpl, context)
			ctx.Statement.Block(G.Id(out)).Line()
			return nil
		},
	}
)

// var (
// 	project        = ctx.Project
// 	method         = ctx.Method
// 	responseEntity = GenericPart.ReplaceAllString(method.Response, "")
// )

// if responseEntity == "" {
// 	panic("Modelo de resposta não definido")
// }

// ctx.Statement.Block(
// 	// Declaracao das variaveis
// 	G.Var().Defs(
// 		// G.Id("err").Op("*").Qual(API_ERROR, "Error"),
// 		G.Id("entity").Op("=").Id("New"+method.Entity).Call(),
// 	).Line(),

// 	// Fazendo o parse do body
// 	G.If(
// 		G.Id("err").Op("=").Qual(API_URL, "ReadJson").Call(G.Id("ctx"), G.Id("entity")),
// 		G.Id("err").Op("!=").Id("nil"),
// 	).Block(
// 		// G.Id("api").Dot("Falha").Call(
// 		// 	G.Id("ctx"),
// 		// 	G.Id("api").Dot("ErrGeneral"),
// 		// 	G.Id("err").Dot("Error").Call(),
// 		// 	G.Nil(),
// 		// ),
// 		// G.Return(G.Id("err")),
// 		G.Return(),
// 	).Line(),

// 	G.Id("values").Op(":=").Id("ctx").Dot("Values()").Line(),

// 	G.Do(func(part *G.Statement) {
// 		entity := ctx.Project.GetSchema(method.Entity)
// 		user := false
// 		for _, prop := range entity.Properties {
// 			if def, ok := prop.Autogenerate["create_action"]; ok {
// 				switch def.Type {
// 				case "user":
// 					if !user {
// 						part.Add(G.Id(`user := values.Get("$user.ref").(*UserReference)`).Line())
// 						user = true
// 					}
// 					part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Id("user").Line())
// 				case "now":
// 					part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Qual("time", "Now").Call().Id(".Unix()").Line())
// 				case "fn":
// 					part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Id(def.Args[0]).Call().Line())
// 				default:
// 					// fmt.Println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
// 					// spew.Dump(def)
// 					// parts := strings.Split(def, "#")
// 					// part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Qual("time", "Now").Call().Id(".Unix()").Line())
// 				}
// 			}
// 		}
// 	}).Line(),

// 	G.Do(func(s *G.Statement) {
// 		entity := ctx.Project.EntityDesc(method.Entity)
// 		if entity != nil && entity.HasMode {
// 			s.Add(G.Id(`entity.SetMode("create")`))
// 		}
// 	}),
// 	G.If(
// 		G.Id("err").Op("=").Qual(API_URL, "Validate").Call(G.Id("entity")),
// 		G.Id("err").Op("!=").Id("nil"),
// 	).Block(
// 		// G.Return(G.Id("err")),
// 		G.Return(),
// 	).Line(),

// 	// Carrega o filtro do contexto para adicionar a entidade
// 	G.Id("filter").Op(":=").Id("values").Dot("Get").Call(
// 		G.Lit("$filter"),
// 	).Assert(G.Op("*").Qual(API_URL, "Filter")).Line(),

// 	// Adiciona a entidade
// 	G.Id("filter").Dot("DB").Op("=").Lit(ctx.Project.GetEntityDB(method.Entity)),
// 	G.Id("filter").Dot("Collection").Op("=").Lit(ctx.Project.GetCollection(method.Entity)),
// 	G.Id("filter").Dot("Entity").Op("=").Id("entity"),
// 	generateHookCall(project, method, "beforePersist"),
// 	// Inseri a entidade na coleção e verifica se a operação ocorreu com exito
// 	G.If(
// 		G.List(G.Id("_"), G.Id("err")).Op("=").Id("Models").Dot("InsertOne").Call(
// 			G.Id("filter"),
// 		),
// 		G.Id("err").Op("!=").Id("nil"),
// 	).Block(
// 		// G.Id("api").Dot("Falha").Call(
// 		// 	G.Id("ctx"),
// 		// 	G.Id("api").Dot("ErrGeneral"),
// 		// 	G.Id("err").Dot("Error").Call(),
// 		// 	G.Nil(),
// 		// ),
// 		// bson.IsObjectIdHex(m.Id.Hex())
// 		// G.Return(G.Id("err")),
// 		G.Return(),
// 	),

// 	// Envia a resposta pro usuario em caso de sucesso
// 	// G.Line().Id("ctx").Dot("JSON").Call(G.Qual(APIC, "Map").Values(G.Dict{
// 	// 	G.Lit("entity"): G.Id("entity"),
// 	// })),
// 	// G.Line().Id("resp").Dot("Entity").Op("=").Id("entity"),
// 	// G.Line().Id("resp").Op("=").Id(responseEntity).Values(G.Dict{
// 	// 	G.Id("Entity"): G.Id("entity"),
// 	// }),
// 	G.Line().Id("resp").Op("=").Id("entity"),
// 	generateHookCall(project, method, "beforeSend"),
// 	// G.Return(G.Nil()),
// 	G.Return(),
// )
