package chart

import (
	"bufio"
	"io"
	"os"

	exception "github.com/blendlabs/go-exception"
)

var (
	// File contains file utility functions
	File = fileUtil{}
)

type fileUtil struct{}

// ReadByLines reads a file and calls the handler for each line.
func (fu fileUtil) ReadByLines(filePath string, handler func(line string)) error {
	if f, err := os.Open(filePath); err == nil {
		defer f.Close()

		scanner := bufio.NewScanner(f)
		for scanner.Scan() {
			line := scanner.Text()
			handler(line)
		}
	} else {
		return exception.Wrap(err)
	}
	return nil
}

// ReadByChunks reads a file in `chunkSize` pieces, dispatched to the handler.
func (fu fileUtil) ReadByChunks(filePath string, chunkSize int, handler func(line []byte)) error {
	if f, err := os.Open(filePath); err == nil {
		defer f.Close()

		chunk := make([]byte, chunkSize)
		for {
			readBytes, err := f.Read(chunk)
			if err == io.EOF {
				break
			}
			readData := chunk[:readBytes]
			handler(readData)
		}
	} else {
		return exception.Wrap(err)
	}
	return nil
}
