package utils

import (
	"archive/tar"
	"compress/gzip"
	"io"
	"os"
	"path/filepath"
)

func DeleteFile(filePath string) error {

	if _, err := os.Stat(filePath); err == nil {
		// 文件存在，删除文件
		err := os.Remove(filePath)
		if err != nil {
			return err
		}
	}

	return nil
}

// ClearDirectory 清空目录下的所有文件但不删除目录本身
func ClearDirectory(dir string) error {
	// 遍历目录中的所有文件和子目录
	err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		// 忽略目录本身
		if path == dir {
			return nil
		}

		// 删除文件
		err = os.Remove(path)
		if err != nil {
			return err
		}

		return nil
	})

	return err
}

func Unzip(fileName string, destDir string) error {
	// 打开要解压缩的文件
	file, err := os.Open(fileName)
	if err != nil {
		return err
	}
	defer file.Close()

	// 创建一个 gzip.Reader
	reader, err := gzip.NewReader(file)
	if err != nil {
		return err
	}
	defer reader.Close()

	// 创建一个 tar.Reader
	tarReader := tar.NewReader(reader)

	// 遍历 tar 文件中的每个文件
	for {
		header, err := tarReader.Next()

		if err == io.EOF {
			// 已经遍历完所有文件
			break
		}

		if err != nil {
			return err
		}

		// 创建一个新文件
		destPath := filepath.Join(destDir, header.Name)
		if header.FileInfo().IsDir() {
			// 如果是目录，创建目录
			if err := os.MkdirAll(destPath, 0755); err != nil {
				return err
			}
			continue
		}
		newFile, err := os.Create(destPath)
		if err != nil {
			return err
		}

		// 将文件内容复制到新文件中
		if _, err := io.Copy(newFile, tarReader); err != nil {
			return err
		}

		// 关闭文件
		if err := newFile.Close(); err != nil {
			return err
		}
	}

	return nil
}
