package file

import (
	"encoding/csv"
	"os"
	"path/filepath"
	"strings"

	"be.ems/src/framework/logger"
)

// 写入CSV文件，需要转换数据
// 例如：
// data := [][]string{}
// data = append(data, []string{"姓名", "年龄", "城市"})
// data = append(data, []string{"1", "2", "3"})
// err := file.WriterFileCSV(data, filePath)
func WriterFileCSV(data [][]string, filePath string) error {
	// 创建本地输出目录
	if err := os.MkdirAll(filepath.Dir(filePath), 0775); err != nil {
		return err
	}

	// 创建或打开文件
	file, err := os.Create(filePath)
	if err != nil {
		return err
	}
	defer file.Close()

	// 创建CSV编写器
	writer := csv.NewWriter(file)
	defer writer.Flush()

	// 写入数据
	for _, row := range data {
		writer.Write(row)
	}
	return nil
}

// 读取CSV文件，转换map数据
func ReadFileCSV(filePath string) []map[string]string {
	// 创建 map 存储 CSV 数据
	arr := make([]map[string]string, 0)

	// 打开 CSV 文件
	file, err := os.Open(filePath)
	if err != nil {
		logger.Errorf("Open CSV file: %v", err)
		return arr
	}
	defer file.Close()

	// 创建 CSV Reader
	reader := csv.NewReader(file)

	// 读取 CSV 头部行
	header, err := reader.Read()
	if err != nil {
		logger.Errorf("Read CSV header rows: %v", err)
		return arr
	}

	// 遍历 CSV 数据行
	for {
		// 读取一行数据
		record, err := reader.Read()
		if err != nil {
			// 到达文件末尾或遇到错误时退出循环
			break
		}

		// 将 CSV 数据插入到 map 中
		data := make(map[string]string)
		for i, value := range record {
			key := strings.ToLower(header[i])
			data[key] = value
		}
		arr = append(arr, data)
	}

	return arr
}
