package xlstranslator

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

// ConversionError records a single failure during XLSX→CSV conversion.
type ConversionError struct {
	Timestamp  time.Time
	SourceFile string
	Stage      string // always "conversion"
	SheetName  string
	RowNumber  int
	RawData    string
	ErrorMsg   string
}

// ErrorLogger collects and writes conversion errors to CSV.
type ErrorLogger struct {
	errors []ConversionError
}

func NewErrorLogger() *ErrorLogger {
	return &ErrorLogger{}
}

func (el *ErrorLogger) Add(sourceFile, sheetName string, rowNumber int, rawData, errorMsg string) {
	el.errors = append(el.errors, ConversionError{
		Timestamp:  time.Now().UTC(),
		SourceFile: sourceFile,
		Stage:      "conversion",
		SheetName:  sheetName,
		RowNumber:  rowNumber,
		RawData:    rawData,
		ErrorMsg:   errorMsg,
	})
}

func (el *ErrorLogger) HasErrors() bool {
	return len(el.errors) > 0
}

func (el *ErrorLogger) WriteToFile(sourceFile string) error {
	if !el.HasErrors() {
		return nil
	}

	dir := "/app/docs/errors"
	if err := os.MkdirAll(dir, 0755); err != nil {
		return err
	}

	ts := time.Now().UTC().Format("20060102_150405")
	base := filepath.Base(sourceFile)
	filename := fmt.Sprintf("conversion_%s_%s.csv", base, ts)
	fp := filepath.Join(dir, filename)

	file, err := os.Create(fp)
	if err != nil {
		return err
	}
	defer file.Close()

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

	// Header
	writer.Write([]string{"timestamp", "source_file", "stage", "sheet_name", "row_number", "raw_data", "error_message"})

	for _, e := range el.errors {
		writer.Write([]string{
			e.Timestamp.Format(time.RFC3339),
			e.SourceFile,
			e.Stage,
			e.SheetName,
			fmt.Sprintf("%d", e.RowNumber),
			e.RawData,
			e.ErrorMsg,
		})
	}

	fmt.Printf("  Error log written: %s (%d errors)\n", filename, len(el.errors))
	return nil
}
