package xvdoc

import (
	"encoding/json"
	"fmt"
	"io"
	"os"

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

func ImportXLSXFromFile(fileName string) (res []*Sheet, err error) {
	var f *os.File
	if f, err = os.Open(fileName); err == nil {
		res, err = ImportXLSX(f)
		f.Close()
	}
	return
}

func ImportXLSX(r io.Reader) (res []*Sheet, err error) {
	var f *excelize.File
	if f, err = excelize.OpenReader(r); err != nil {
		return
	}
	res = make([]*Sheet, 0, f.SheetCount)
	for _, sheetName := range f.GetSheetMap() {
		sheet := Sheet{name: sheetName}
		if sheet.rows, err = f.GetRows(sheet.name); err != nil {
			return
		}
		res = append(res, &sheet)
	}
	return
}

func ImportXLSXToJSON(r io.Reader) (res []byte, err error) {
	var sheets []*Sheet
	if sheets, err = ImportXLSX(r); err != nil {
		return
	}
	res, err = json.Marshal(sheets)
	return
}

func ImportXLSXToJSONFromFile(fileName string) (res []byte, err error) {
	var f *os.File
	if f, err = os.Open(fileName); err == nil {
		res, err = ImportXLSXToJSON(f)
		f.Close()
	}
	return
}

type Sheet struct {
	name string
	rows [][]string
}

func (s *Sheet) String() string {
	return fmt.Sprint(s.name, s.rows)
}

func (s *Sheet) MarshalJSON() ([]byte, error) {
	m := map[string]interface{}{
		"name": s.name,
		"rows": s.rows,
	}
	return json.Marshal(m)
}