package csvwriter

import (
	"encoding/csv"
	"fmt"
	"os"
	"path/filepath"
)

type BenchmarkResult struct {
	Structure string
	Mode      string
	Operation string
	Time      float64
}

func (b *BenchmarkResult) ToString() string {
	return fmt.Sprintf("%s %s %s %f", b.Structure, b.Mode, b.Operation, b.Time)
}
func (b *BenchmarkResult) ToStrings() []string {
	return []string{b.Structure, b.Mode, b.Operation, fmt.Sprintf("%f", b.Time)}
}

// Создаём пустой csv файл с заголовками
func CreateEmptyCSV(dir, name string) error {
	filename := filepath.Join(dir, name)

	file, err := os.Create(filename)

	if err != nil {
		return err
	}
	defer file.Close()

	writer := csv.NewWriter(file)
	defer writer.Flush()
	header := []string{"Structure", "Mode", "Operation", "Time"}
	writer.Write(header)

	return writer.Error()
}

// AppendRaw дописывает произвольные строки в CSV
func AppendRaw(results []BenchmarkResult) error {

	filename := filepath.Join("results", "benchmarks.csv")

	fileExists := true
	isEmpty := true
	if info, err := os.Stat(filename); err == nil {
		isEmpty = info.Size() == 0
	} else if os.IsNotExist(err) {
		fileExists = false
	}

	file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		return err
	}
	defer file.Close()

	writer := csv.NewWriter(file)
	defer writer.Flush()

	// Если файл новый или пустой, записываем заголовки
	if !fileExists || isEmpty {
		header := []string{"Structure", "Mode", "Operation", "Time"}
		if err := writer.Write(header); err != nil {
			return fmt.Errorf("не удалось записать заголовки: %w", err)
		}
	}

	rows := make([][]string, len(results))

	for i, res := range results {
		rows[i] = res.ToStrings()
		// fmt.Println(res.ToStrings())
	}

	return writer.WriteAll(rows) // WriteAll пишет всё сразу
}
