package filter

import (
	"io/ioutil"
	"path"
	"strings"

	"gitbase.de/apairon/mark2web/pkg/helper"
	"gitbase.de/apairon/mark2web/pkg/mark2web"
	"github.com/ddliu/motto"
	"github.com/flosch/pongo2"
	_ "github.com/robertkrimen/otto/underscore"
)

// RegisterFilters reads a directory and register filters from files within it
func RegisterFilters(dir string) {
	files, err := ioutil.ReadDir(dir)
	if err != nil {
		helper.Log.Panicf("could not read from template filters dir '%s': %s", dir, err)
	}
	for _, f := range files {
		if !f.IsDir() {
			switch path.Ext(f.Name()) {
			case ".js":
				fileBase := strings.TrimSuffix(f.Name(), ".js")
				jsFile := dir + "/" + f.Name()
				helper.Log.Debugf("trying to register filter from: %s", jsFile)
				/*
					jsStr, err := ioutil.ReadFile(jsFile)
					if err != nil {
						Log.Panicf("could not read '%s': %s", jsFile, err)
					}
				*/
				vm := motto.New()
				fn, err := vm.Run(jsFile)
				if err != nil {
					helper.Log.Panicf("error in javascript vm for '%s': %s", jsFile, err)
				}
				if !fn.IsFunction() {
					helper.Log.Panicf("%s does not contain a function code", jsFile)
				}

				err = pongo2.RegisterFilter(
					fileBase,
					func(in, param *pongo2.Value) (out *pongo2.Value, erro *pongo2.Error) {
						thisObj, _ := vm.Object("({})")
						if mark2web.CurrentContext != nil {
							thisObj.Set("context", *mark2web.CurrentContext)
						}

						if err != nil {
							helper.Log.Panicf("could not set context as in '%s': %s", jsFile, err)
						}
						ret, err := fn.Call(thisObj.Value(), in.Interface(), param.Interface())
						if err != nil {
							helper.Log.Panicf("error in javascript file '%s' while calling returned function: %s", jsFile, err)
						}
						retGo, err := ret.Export()
						if err != nil {
							helper.Log.Panicf("export error for '%s': %s", jsFile, err)
						}
						return pongo2.AsValue(retGo), nil
					},
				)
				if err != nil {
					helper.Log.Panicf("could not register filter from '%s': %s", jsFile, err)
				}

			}
		}
	}

}
