package utils

import (
	"errors"
	"io"
	"reflect"

	"github.com/astaxie/beego"

	"github.com/tealeg/xlsx"
)

// TinyXLSXEngine 简版 xlsx 处理器
type TinyXLSXEngine struct {
	xlsxFile *xlsx.File
	sheet    *xlsx.Sheet
}

// NewTinyXLSXEngine init
func NewTinyXLSXEngine() (*TinyXLSXEngine, error) {
	file := xlsx.NewFile()

	sheet, err := file.AddSheet("sheet1")
	if err != nil {
		beego.Error("创建 xlsx sheet 失败: " + err.Error())
		return nil, errors.New("创建 xlsx sheet 失败")
	}

	return &TinyXLSXEngine{
		xlsxFile: file,
		sheet:    sheet,
	}, nil
}

// InsertRow 新增行
func (t *TinyXLSXEngine) InsertRow() *xlsx.Row {
	return t.sheet.AddRow()
}

// SetCell 新增数据
func (t *TinyXLSXEngine) SetCell(row *xlsx.Row, v interface{}) {
	rv := reflect.ValueOf(v)
	if rv.Kind() == reflect.Slice {
		for i := 0; i < rv.Len(); i++ {
			row.AddCell().SetValue(rv.Index(i).Interface())
		}
	} else {
		row.AddCell().SetValue(v)
	}
}

// Write 写数据
func (t *TinyXLSXEngine) Write(w io.Writer) error {
	return t.xlsxFile.Write(w)
}
