package core

import (
	"errors"
	"io/ioutil"
	"os"
	"path/filepath"
	"runtime"

	"github.com/axgle/mahonia"
	"github.com/dop251/goja"
)

func getJsOs(vm *goja.Runtime, running func() bool) *goja.Object {
	var jsos = vm.NewObject()
	jsos.Set("readFile", func(name string) []byte {
		data, err := os.ReadFile(name)
		if err != nil {
			panic(Error(vm, err))
		}
		return data
	})

	jsos.Set("readFileSync", func(path string, decode string) string {
		// 读取文件内容
		content, err := ioutil.ReadFile(path)
		if err != nil {
			panic(Error(vm, err))
		}
		if decode == "" || decode == "utf-8" {
			return string(content)
		}
		srcCoder := mahonia.NewDecoder(decode)
		srcResult := srcCoder.ConvertString(string(content))
		return srcResult
		// return ConvertToString(string(content), decode, "utf-8")
		// if decode == "" {
		// 	return string(content)
		// }
		// coder := mahonia.NewEncoder(decode)
		// return coder.ConvertString(string(content))

		// // 从文件内容中自动检测编码
		// encoding, name, _ := charset.DetermineEncoding(content, "")
		// logs.Debug("name", name)

		// // 创建一个将编码转换为 UTF-8 的转换器
		// utf8Reader := transform.NewReader(bytes.NewReader(content), encoding.NewDecoder())

		// // 读取转换后的 UTF-8 数据
		// utf8Content, err := ioutil.ReadAll(utf8Reader)
		// if err != nil {
		// 	panic(Error(vm, err))
		// }
		// return string(utf8Content)
	})

	jsos.Set("writeFileSync", func(path, content string, encode string) {
		converted := ""
		if encode == "" || encode == "utf-8" {
			converted = content
		} else {
			tagCoder := mahonia.NewEncoder(encode)
			converted = tagCoder.ConvertString(content)
		}
		// 覆盖写入文件
		err := os.WriteFile(path, []byte(converted), 0644)
		if err != nil {
			panic(Error(vm, err))
		}
		// if encode == "" {
		// 	encode = "utf-8"
		// }
		// if encode == "utf-8" {
		// 	// 覆盖写入文件
		// 	err := os.WriteFile(path, []byte(content), 0644)
		// 	if err != nil {
		// 		panic(Error(vm, err))
		// 	}
		// 	return
		// }
		// // 将UTF-8编码的文本转换为指定编码
		// index := ianaindex.MIME
		// enc, err := index.Encoding(encode)
		// if err != nil {
		// 	panic(Error(vm, err))
		// }
		// converted, _, err := transform.String(enc.NewEncoder(), content)
		// if err != nil {
		// 	panic(Error(vm, err))
		// }
		// // 覆盖写入文件
		// err = os.WriteFile(path, []byte(converted), 0644)
		// if err != nil {
		// 	panic(Error(vm, err))
		// }
	})
	jsos.Set("walkFilePath", func(root string, callback func(path string, info os.FileInfo) bool) {
		err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
			if !running() {
				return errors.New("over")
			}
			if err != nil {
				panic(Error(vm, err))
			}
			if !callback(path, info) {
				return errors.New("over")
			}
			return nil
		})
		if err != nil && err.Error() != "over" {
			panic(Error(vm, err))
		}
	})
	jsos.Set("userHomeDir", func() string {
		dir, err := os.UserHomeDir()
		if err != nil {
			panic(Error(vm, err))
		}
		return dir
	})
	jsos.Set("name", runtime.GOOS)
	jsos.Set("arch", runtime.GOARCH)
	return jsos
}

func ConvertToString(src string, srcCode string, tagCode string) string {
	if srcCode == tagCode {
		return src
	}
	srcResult := ""
	if srcCode == "utf-8" {
		srcResult = src
	} else {
		srcCoder := mahonia.NewDecoder(srcCode)
		srcResult = srcCoder.ConvertString(src)
	}
	if tagCode == "utf-8" {
		return srcResult
	}
	tagCoder := mahonia.NewEncoder(tagCode)
	result := tagCoder.ConvertString(srcResult)
	return result
}
