package vfs

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

	"github.com/databricks/cli/libs/filer"
)

type filerPath struct {
	ctx  context.Context
	path string
	fs   FS

	construct func(path string) (filer.Filer, error)
}

func NewFilerPath(ctx context.Context, path string, construct func(path string) (filer.Filer, error)) (Path, error) {
	f, err := construct(path)
	if err != nil {
		return nil, err
	}

	return &filerPath{
		ctx:  ctx,
		path: path,
		fs:   filer.NewFS(ctx, f).(FS),

		construct: construct,
	}, nil
}

func (f filerPath) Open(name string) (fs.File, error) {
	return f.fs.Open(name)
}

func (f filerPath) Stat(name string) (fs.FileInfo, error) {
	return f.fs.Stat(name)
}

func (f filerPath) ReadDir(name string) ([]fs.DirEntry, error) {
	return f.fs.ReadDir(name)
}

func (f filerPath) ReadFile(name string) ([]byte, error) {
	return f.fs.ReadFile(name)
}

func (f filerPath) Parent() Path {
	if f.path == "/" {
		return nil
	}

	dir := filepath.Dir(f.path)
	nf, err := NewFilerPath(f.ctx, dir, f.construct)
	if err != nil {
		panic(err)
	}

	return nf
}

func (f filerPath) Native() string {
	return f.path
}