package module

import (
	"context"

	"forge.cadoles.com/arcad/edge/pkg/app"
	"github.com/dop251/goja"
	"gitlab.com/wpetit/goweb/logger"
)

type LifecycleModule struct{}

func (m *LifecycleModule) Name() string {
	return "lifecycle"
}

func (m *LifecycleModule) Export(export *goja.Object) {
}

func (m *LifecycleModule) OnInit(ctx context.Context, rt *goja.Runtime) (err error) {
	call, ok := goja.AssertFunction(rt.Get("onInit"))
	if !ok {
		logger.Warn(ctx, "could not find onInit() function")

		return nil
	}

	defer func() {
		recovered := recover()
		if recovered == nil {
			return
		}

		recoveredErr, ok := recovered.(error)
		if !ok {
			panic(recovered)
		}

		err = recoveredErr
	}()

	call(nil, rt.ToValue(ctx))

	return nil
}

func LifecycleModuleFactory() app.ServerModuleFactory {
	return func(server *app.Server) app.ServerModule {
		module := &LifecycleModule{}

		return module
	}
}

var _ app.InitializableModule = &LifecycleModule{}