package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"github.com/klauspost/compress/zip"
	"io"
	"os"
	"os/exec"
	"path"
)

type Conf struct {
	SrcPath string `json:"srcPath"`
	DesPath string `json:"destPath"`
	CmdPath string `json:"cmdPath"`
}

func pathExist(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

func main() {
	fileBuffer, err := os.ReadFile("./config.json")
	if err != nil {
		fmt.Println("获取srcPath desPath失败")
		return
	}
	var c Conf
	e := json.Unmarshal(fileBuffer, &c)
	if e != nil {
		fmt.Println("从配置文件中获取srcPath desPath失败")
		return
	}
	fmt.Println("源路径为", c.SrcPath)
	fmt.Println("目标路径为", c.DesPath)

	srcstate, _ := pathExist(c.SrcPath)
	if !srcstate {
		fmt.Println("源路径不存在无法进行转换")
		return
	}
	desState, _ := pathExist(c.DesPath)
	if !desState {
		fmt.Println("目标路径，请修改配置文件")
		return
	}

	//直接将目录下的文件全部进行转换
	fileInfo, dirErr := os.ReadDir(c.SrcPath)
	if dirErr != nil {
		fmt.Println("遍历源路径出现错误")
		return
	}
	for _, v := range fileInfo {
		name := v.Name()

		if path.Ext(name) == ".json" {
			//将json文件进行转换
			fileAllName := path.Base(name)
			fileSufix := path.Ext(name)
			filePrefix := fileAllName[0 : len(fileAllName)-len(fileSufix)]
			cvt2Bin(c.SrcPath, c.DesPath, filePrefix, c.CmdPath)
		}
	}

}

// 将单个文件转换
func cvt2Bin(src string, des string, name string, cmdPath string) {
	srcPath := path.Join(src, name+".json")
	desPath := path.Join(des, name+".bin")
	fmt.Println("压缩文件开始", srcPath, desPath)

	//如果目标文件已经存在则删除
	if exist, _ := pathExist(desPath); exist {
		os.Remove(desPath)
	}

	//f,err := os.Open(srcPath)
	//if err != nil{
	//	return
	//}
	//defer f.Close()
	//d,_ := os.Create(desPath)
	//defer d.Close()
	//w := zip.NewWriter(d)
	//defer w.Close()
	//err = compress(f,"",w)
	//if err != nil{
	//	fmt.Println(err)
	//	return
	//}

	//直接使用7z 进行压缩就可以
	//7z a -tzip  D:\VietnamGame\trunk\fishpath\json\custom1.bin   custom1.json
	cmdStr := "%s/7z.exe a -tzip %s %s"
	cmdStr = fmt.Sprintf(cmdStr, cmdPath, desPath, srcPath)
	cmd := exec.Command("cmd.exe", "/c", cmdStr)

	var out bytes.Buffer
	var stderr bytes.Buffer
	cmd.Stdout = &out
	cmd.Stderr = &stderr
	err := cmd.Run()
	if err != nil {
		fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
		return
	}
	fmt.Println("Result: " + out.String())

	//cmd := exec.Command(cmdStr,"/c")
	//if err := cmd.Run(); err != nil {
	//	fmt.Println("压缩文件是失败", desPath)
	//	return
	//}
	fmt.Println("压缩文件到成功", desPath)
}

func compress(file *os.File, prefix string, zw *zip.Writer) error {
	info, err := file.Stat()
	if err != nil {
		return err
	}
	header, err := zip.FileInfoHeader(info)
	if len(prefix) == 0 {
		header.Name = header.Name
	} else {
		header.Name = prefix + "/" + header.Name
	}
	if err != nil {
		return err
	}
	writer, err := zw.CreateHeader(header)
	if err != nil {
		return err
	}
	_, err = io.Copy(writer, file)
	file.Close()
	if err != nil {
		return err
	}
	return nil
}
