package engine

import (
	"path/filepath"

	"github.com/yaoapp/gou"
	"github.com/yaoapp/yao/config"
	"github.com/yaoapp/yao/share"
	"github.com/yaoapp/yao/xfs"
)

func init() {
	// 注册处理器
	gou.RegisterProcessHandler("xiang.main.Ping", processPing)
	gou.AliasProcess("xiang.main.Ping", "xiang.sys.Ping")

	gou.RegisterProcessHandler("xiang.main.FileContent", processFileContent)
	gou.RegisterProcessHandler("xiang.main.AppFileContent", processAppFileContent)

	gou.RegisterProcessHandler("xiang.main.Inspect", processInspect)
	gou.AliasProcess("xiang.main.Inspect", "xiang.sys.Inspect")

	gou.RegisterProcessHandler("xiang.main.Favicon", processFavicon)
}

// processCreate 运行模型 MustCreate
func processPing(process *gou.Process) interface{} {
	res := map[string]interface{}{
		"engine":  share.BUILDNAME,
		"version": share.VERSION,
	}
	return res
}

// processInspect 返回系统信息
func processInspect(process *gou.Process) interface{} {
	share.App.Icons.Set("favicon", "/api/xiang/favicon.ico")
	return share.App.Public()
}

// processFavicon 运行模型 MustCreate
func processFavicon(process *gou.Process) interface{} {
	return xfs.DecodeString(share.App.Icons.Get("png").(string))
}

// processFileContent 返回文件内容
func processFileContent(process *gou.Process) interface{} {
	process.ValidateArgNums(2)
	filename := process.ArgsString(0)
	encode := process.ArgsBool(1, true)
	content := xfs.Stor.MustReadFile(filename)
	if encode {
		return xfs.Encode(content)
	}
	return string(content)
}

// processAppFileContent 返回应用文件内容
func processAppFileContent(process *gou.Process) interface{} {
	process.ValidateArgNums(2)
	fs := xfs.New(filepath.Join(config.Conf.Root, "data"))
	filename := process.ArgsString(0)
	encode := process.ArgsBool(1, true)
	content := fs.MustReadFile(filename)
	if encode {
		return xfs.Encode(content)
	}
	return string(content)
}
