package read

import (
	"context"
	"io"
	"os"
	"path/filepath"

	"github.com/go-task/task/v3/internal/filepathext"
)

// A FileNode is a node that reads a taskfile from the local filesystem.
type FileNode struct {
	*BaseNode
	Dir        string
	Entrypoint string
}

func NewFileNode(uri string, opts ...NodeOption) (*FileNode, error) {
	base := NewBaseNode(opts...)
	if uri == "" {
		d, err := os.Getwd()
		if err != nil {
			return nil, err
		}
		uri = d
	}
	path, err := Exists(uri)
	if err != nil {
		return nil, err
	}
	return &FileNode{
		BaseNode:   base,
		Dir:        filepath.Dir(path),
		Entrypoint: filepath.Base(path),
	}, nil
}

func (node *FileNode) Location() string {
	return filepathext.SmartJoin(node.Dir, node.Entrypoint)
}

func (node *FileNode) Remote() bool {
	return false
}

func (node *FileNode) Read(ctx context.Context) ([]byte, error) {
	f, err := os.Open(node.Location())
	if err != nil {
		return nil, err
	}
	defer f.Close()
	return io.ReadAll(f)
}