// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package uiserver

import (
	"bytes"
	"io/fs"
	"os"
	"time"
)

// bufferedFile implements fs.File and allows us to modify a file from disk by
// writing out the new version into a buffer and then serving file reads from
// that.
type bufferedFile struct {
	buf  *bytes.Buffer
	info fs.FileInfo
}

var _ fs.FileInfo = (*bufferedFile)(nil)

func newBufferedFile(buf *bytes.Buffer, info fs.FileInfo) *bufferedFile {
	return &bufferedFile{
		buf:  buf,
		info: info,
	}
}

func (b *bufferedFile) Stat() (fs.FileInfo, error) {
	return b, nil
}

func (b *bufferedFile) Read(bytes []byte) (int, error) {
	return b.buf.Read(bytes)
}

func (b *bufferedFile) Close() error {
	return nil
}

func (b *bufferedFile) Name() string {
	return b.info.Name()
}

func (b *bufferedFile) Size() int64 {
	return int64(b.buf.Len())
}

func (b *bufferedFile) Mode() os.FileMode {
	return b.info.Mode()
}

func (b *bufferedFile) ModTime() time.Time {
	return b.info.ModTime()
}

func (b *bufferedFile) IsDir() bool {
	return false
}

func (b *bufferedFile) Sys() any {
	return nil
}