package mjs

import (
	"errors"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"testing"
	"time"

	"github.com/dop251/goja"
)

var contentPath = "content"

func filePath(name string) string {
	return fmt.Sprintf("%v/%v", contentPath, name)
}

func modified(name string) (res int64) {
	if info, err := os.Stat(filePath(name)); err == nil {
		res = info.ModTime().Unix()
	}
	return
}

func content(name string) ([]byte, error) {
	return ioutil.ReadFile(filePath(name))
}

func TestMJS(t *testing.T) {
	mjs := New(modified, content)
	for i := 0; i < 20; i++ {
		modified, err := mjs.Exec("main", map[string]interface{}{
			"flush": func(args ...interface{}) {
				log.Println(args)
			},
		}, time.Second*300)
		t.Log(err, err == nil, modified)
	}
}

type CallResult struct {
}

func Call(runtime *goja.Runtime, call goja.Callable) {
	log.Println("CALL_START", runtime, call)
	if call == nil {
		log.Println(errors.New("OKKO"))
		log.Println("CALL_FINIFH - nil")
		return
	}
	result, err := call(goja.Undefined())
	log.Println("CALL_FINIFH - nil", result, err)
	//return errors.New("ERRRRROR")
}

func TestInterrupt(t *testing.T) {
	mjs := New(modified, content)
	for i := 0; i < 2; i++ {
		modified, err := mjs.Exec("interrupt", map[string]interface{}{
			"call": Call,
			"flush": func(args ...interface{}) {
				log.Println(args)
			},
		}, time.Second*5)
		t.Log(err, err == nil, modified)
	}
	time.Sleep(time.Second * 10)
}