package main

import (
	"encoding/json"
	"fmt"
	"io"
	"os"
	"path"
	"strings"
)

type Conf struct {
	SrcPath  string `json:"srcPath"`
	DestPath string `json:"destPath"`
}

// 判断路径是否存在
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和destpath发生错误")
		return
	}
	var c Conf

	e := json.Unmarshal(fileBuffer, &c)
	if e != nil {
		fmt.Println("从配置文件中获取srcpath和destpath发生错误")
	}

	fmt.Println("源路径为:%s", c.SrcPath)
	fmt.Println("目标路径为:%s", c.DestPath)

	//判定源路径是否存在
	srcstat, _ := pathExist(c.SrcPath)
	if !srcstat {
		fmt.Println("源路径不存在，无法执行转换")
	}
	deststate, _ := pathExist(c.DestPath)
	if !deststate {
		fmt.Println("目标路径不存在，请修改配置文件")
	}

	copyDataToBin(c.SrcPath, c.DestPath)
}

// 将 srcPath目录中的文件copy到 目标对应文件中 并且要修改后缀名
func copyDataToBin(srcPath string, targetPath string) {
	rd, err := os.ReadDir(srcPath)
	if err != nil {
		fmt.Println("遍历文件是发生错误")
		return
	}
	for _, fi := range rd {
		if fi.IsDir() {
			//copyDataToBin(srcPath + fi.Name(),targetPath + fi.Name())
			copyDataToBin(path.Join(srcPath, fi.Name()), path.Join(targetPath, fi.Name()))
		} else {

			fullPath := path.Join(srcPath, fi.Name())
			ext := path.Ext(fullPath)
			//判定文件的后缀名为.bat则copy
			if ext == ".dat" {
				createTargetDir(targetPath)

				//判定目标文件是否已经存在。如果存在删除
				//fulleTargetPath := targetPath + fi.Name()
				strArr := strings.Split(fi.Name(), ".")
				baseName := strArr[0]
				tFileName := path.Join(targetPath, baseName) + ".bin"
				targetState, _ := pathExist(tFileName)
				if targetState {
					os.Remove(tFileName)
				}
				copyFile(fullPath, tFileName)
			}
		}
	}
}

func copyFile(srcFile string, targetFile string) {
	src, err := os.Open(srcFile)
	if err != nil {
		fmt.Println("Open file err = %v/n", err)
		return
	}
	defer src.Close()

	dst, err := os.OpenFile(targetFile, os.O_WRONLY|os.O_CREATE, 0777)
	if err != nil {
		fmt.Println("Open file err = %c/n", err)
		return
	}
	defer dst.Close()
	io.Copy(dst, src)
}

// 创建目录
func createTargetDir(destDir string) {
	dirState, _ := pathExist(destDir)
	if !dirState {
		os.Mkdir(destDir, os.ModePerm)
	}
}
