package runtime

import (
	"fmt"

	jsoniter "github.com/json-iterator/go"
	"github.com/yaoapp/gou/application"
	v8 "github.com/yaoapp/gou/runtime/v8"
	"github.com/yaoapp/yao/config"
)

// Start v8 runtime
func Start(cfg config.Config) error {

	debug := false
	if cfg.Mode == "development" {
		debug = true
	}

	option := &v8.Option{
		MinSize:           cfg.Runtime.MinSize,
		MaxSize:           cfg.Runtime.MaxSize,
		HeapSizeLimit:     cfg.Runtime.HeapSizeLimit,
		HeapAvailableSize: cfg.Runtime.HeapAvailableSize,
		HeapSizeRelease:   cfg.Runtime.HeapSizeRelease,
		Precompile:        cfg.Runtime.Precompile,
		DataRoot:          cfg.DataRoot,
		Mode:              cfg.Runtime.Mode,
		DefaultTimeout:    cfg.Runtime.DefaultTimeout,
		ContextTimeout:    cfg.Runtime.ContextTimeout,
		Import:            cfg.Runtime.Import,
		Debug:             debug,
		ConsoleMode:       cfg.Mode,
	}

	// Read the tsconfig.json
	if cfg.Runtime.Import && application.App != nil {
		if exist, _ := application.App.Exists("tsconfig.json"); exist {
			var tsconfig v8.TSConfig
			raw, err := application.App.Read("tsconfig.json")
			if err != nil {
				return fmt.Errorf("tsconfig.json is not a valid json file %s", err)
			}

			err = jsoniter.Unmarshal(raw, &tsconfig)
			if err != nil {
				return fmt.Errorf("tsconfig.json is not a valid json file %s", err)
			}
			option.TSConfig = &tsconfig
		}
	}

	err := v8.Start(option)
	if err != nil {
		return err
	}

	return nil
}

// Stop v8 runtime
func Stop() error {
	v8.Stop()
	return nil
}
