package util

import (
	"io"
	"os"
)

//var logFile *os.File

func GenerateUtil(apiName string) { //generateByApiName

	//生成log文件
	//fileName := "debug.log" //在工程路径下和src同级，也可以写绝对路径，不过要注意转义符
	//logFile, _ = os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) //创建该文件，返回句柄
	//defer logFile.Close() //确保文件在该函数执行完以后关闭

	//生成文件夹
	path, _ := os.Getwd()
	Mkdir(path + "/testCase")
	Mkdir(path + "/testData")
	Mkdir(path + "/conf")

	//生成文件xxx_test.go
	fileName := apiName + "_test.go"
	dir_file := "testCase/" + fileName

	exist, err := PathExists(dir_file)
	Check(err)

	if exist {
		DebugLog(fileName + "文件已存在！")
	} else {
		fp, err := os.Create(dir_file)
		Check(err)
		DebugLog(fileName + "文件创建成功！")
		//写文件
		wireteString := "package main\n\nimport (\n\t\"github.com/tidbcloud/qa-Gourd/handler\"\n\t\"testing\"\n)\n\nfunc Test_" + apiName + "(t *testing.T){\n\tvar apiName = \"" + apiName + "\"\n\thandler.DoTest(t, apiName, handler.Env)\n}"
		_, err1 := io.WriteString(fp, wireteString) //写入文件(字符串)
		Check(err1)
		DebugLog(fileName + "文件写入成功!")
		defer fp.Close()
	}

	//生成文件xxx.csv
	fileName = apiName + ".csv"
	dir_file = "testData/" + fileName //notice

	exist, err = PathExists(dir_file)
	Check(err)

	if exist {
		DebugLog(fileName + "文件已存在！")
	} else {
		fp, err := os.Create(dir_file)
		Check(err)
		DebugLog(fileName + "文件创建成功！")

		//写文件
		wireteString := "caseNo|desc|apiName|method|isNeed"
		_, err = io.WriteString(fp, wireteString) //写入文件(字符串)

		Check(err)
		DebugLog(fileName + "文件写入成功!")

		defer fp.Close()

	}

	//生成文件staging.conf
	fileName = "staging.conf"
	dir_file = "conf/" + fileName //notice

	exist, err = PathExists(dir_file)
	Check(err)

	if exist {
		DebugLog(fileName + "文件已存在！")
	} else {
		fp, err := os.Create(dir_file)
		Check(err)
		DebugLog(fileName + "文件创建成功！")

		//写文件
		wireteString := "[ENV]\nname=staging\nbaseURL=https://us-west-2.staging.shared.aws.tidbcloud.com\nretry=0\n"
		_, err = io.WriteString(fp, wireteString) //写入文件(字符串)

		Check(err)
		DebugLog(fileName + "文件写入成功!")

		defer fp.Close()

	}

	//生成文件main_test.go
	fileName = "main_test.go"
	dir_file = "testCase/" + fileName //notice

	exist, err = PathExists(dir_file)
	Check(err)

	if exist {
		DebugLog(fileName + "文件已存在！")
	} else {
		fp, err := os.Create(dir_file)
		Check(err)
		DebugLog(fileName + "文件创建成功！")

		//写文件
		wireteString := "package main\n\nimport (\n   \"github.com/tidbcloud/qa-Gourd/handler\"\n   \"os\"\n   \"testing\"\n)\n\nfunc TestMain(m *testing.M) {\n   handler.CommandHandler()\n   setup()\n   code := m.Run()\n   teardown()\n   os.Exit(code)\n}\n\nfunc setup() {\n   // \"Before all tests\"\n}\n\nfunc teardown() {\n   // \"After all tests\"\n}"
		_, err = io.WriteString(fp, wireteString) //写入文件(字符串)

		Check(err)
		DebugLog(fileName + "文件写入成功!")

		defer fp.Close()

	}
}

func PathExists(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 Mkdir(dir string) { //create a folder
	exist, err := PathExists(dir)
	Check(err)

	if exist {
		DebugLog(dir + "文件夹已存在！")
	} else {
		// 文件夹名称，权限
		err := os.Mkdir(dir, os.ModePerm)
		Check(err)
		DebugLog(dir + "文件夹创建成功！")
	}

}
