package tempfile

import (
	"io/ioutil"
	"os"

	"github.com/stretchr/testify/require"
)

// TempFile is a temporary file that can be used with unit tests. TempFile
// reduces the boilerplate setup required in each test case by handling
// setup errors.
type TempFile struct {
	File *os.File
}

// NewTempFile returns a new temp file with contents
func NewTempFile(t require.TestingT, prefix string, content string) *TempFile {
	file, err := ioutil.TempFile("", prefix+"-")
	require.NoError(t, err)

	_, err = file.Write([]byte(content))
	require.NoError(t, err)
	file.Close()
	return &TempFile{File: file}
}

// Name returns the filename
func (f *TempFile) Name() string {
	return f.File.Name()
}

// Remove removes the file
func (f *TempFile) Remove() {
	os.Remove(f.Name())
}

// TempDir is a temporary directory that can be used with unit tests. TempDir
// reduces the boilerplate setup required in each test case by handling
// setup errors.
type TempDir struct {
	Path string
}

// NewTempDir returns a new temp file with contents
func NewTempDir(t require.TestingT, prefix string) *TempDir {
	path, err := ioutil.TempDir("", prefix+"-")
	require.NoError(t, err)

	return &TempDir{Path: path}
}

// Remove removes the file
func (f *TempDir) Remove() {
	os.Remove(f.Path)
}