package blefs

import (
	"io/fs"
	"path/filepath"
)

// Stat does a ReadDir() and finds the current file in the output
func (blefs *FS) Stat(path string) (fs.FileInfo, error) {
	// Get directory in filepath
	dir := filepath.Dir(path)
	// Read directory
	dirEntries, err := blefs.ReadDir(dir)
	if err != nil {
		return nil, err
	}
	for _, entry := range dirEntries {
		// If file name is base name of path
		if entry.Name() == filepath.Base(path) {
			// Return file info
			return entry.Info()
		}
	}
	return nil, ErrFileNotExists
}

// Rename moves or renames a file or directory
func (blefs *FS) Rename(old, new string) error {
	// Create move request
	err := blefs.request(
		FSCmdMove,
		true,
		uint16(len(old)),
		uint16(len(new)),
		old,
		byte(0x00),
		new,
	)
	if err != nil {
		return err
	}
	var status int8
	// Upon receiving 0x61 (FSResponseMove)
	blefs.on(FSResponseMove, func(data []byte) error {
		// Read status byte
		return decode(data, &status)
	})
	// If status is not ok, return error
	if status != FSStatusOk {
		return FSError{status}
	}
	return nil
}

// Remove removes a file or directory
func (blefs *FS) Remove(path string) error {
	// Create delete request
	err := blefs.request(
		FSCmdDelete,
		true,
		uint16(len(path)),
		path,
	)
	if err != nil {
		return err
	}
	var status int8
	// Upon receiving 0x31 (FSResponseDelete)
	blefs.on(FSResponseDelete, func(data []byte) error {
		// Read status byte
		return decode(data, &status)
	})
	if status != FSStatusOk {
		// If status is not ok, return error
		return FSError{status}
	}
	return nil
}