package utils

import (
	"github.com/xuri/excelize/v2"
)

/**
 * ExcelGenerator provides a high-level API to generate Excel reports 
 * with consistent styling across all modules.
 */
type ExcelGenerator struct{}

func NewExcelGenerator() *ExcelGenerator {
	return &ExcelGenerator{}
}

/**
 * CreateSimpleSheet generates a single-sheet Excel file from a slice of data.
 * headers: list of column names
 * rows: slice of row data (each row is a slice of interface{})
 */
func (g *ExcelGenerator) CreateSimpleSheet(sheetName string, headers []string, rows [][]interface{}) ([]byte, error) {
	f := excelize.NewFile()
	defer f.Close()

	f.SetSheetName("Sheet1", sheetName)
	
	// Set Headers with Style
	headerStyle, _ := f.NewStyle(&excelize.Style{
		Font: &excelize.Font{Bold: true, Color: "FFFFFF"},
		Fill: excelize.Fill{Type: "pattern", Color: []string{"2563EB"}, Pattern: 1},
		Alignment: &excelize.Alignment{Horizontal: "center"},
	})

	for i, h := range headers {
		cell, _ := excelize.CoordinatesToCellName(i+1, 1)
		f.SetCellValue(sheetName, cell, h)
		f.SetCellStyle(sheetName, cell, cell, headerStyle)
	}

	// Set Rows
	for i, row := range rows {
		rowIdx := i + 2
		for j, val := range row {
			cell, _ := excelize.CoordinatesToCellName(j+1, rowIdx)
			f.SetCellValue(sheetName, cell, val)
		}
	}

	// Auto-fit column width (basic approximation)
	for i := range headers {
		col, _ := excelize.ColumnNumberToName(i + 1)
		f.SetColWidth(sheetName, col, col, 20)
	}

	buf, err := f.WriteToBuffer()
	if err != nil {
		return nil, err
	}
	return buf.Bytes(), nil
}
