/** Operations for Creating Temporary Files and Directories.
	Copyright: Per Nordlöw 2022-.
	License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
	Authors: $(WEB Per Nordlöw)
 */
module nxt.tempfs;

@safe:

private enum PAGESIZE = 4096;

/** Create a New Temporary File starting with ($D namePrefix) and ending with 6 randomly defined characters.
 *
 * Returns: File Descriptor to opened file.
*/
version (linux)
int tempfile(string namePrefix = null) @trusted
{
	import core.sys.posix.stdlib: mkstemp;
	char[PAGESIZE] buf;
	buf[0 .. namePrefix.length] = namePrefix[]; // copy the name into the mutable buffer
	buf[namePrefix.length .. namePrefix.length + 6] = "XXXXXX"[];
	buf[namePrefix.length + 6] = 0; // make sure it is zero terminated yourself
	auto tmp = mkstemp(buf.ptr);
	return tmp;
}

/** TODO: Scoped variant of tempfile.
 *
 * Search http://forum.dlang.org/thread/mailman.262.1386205638.3242.digitalmars-d-learn@puremagic.com
 */

/** Create a New Temporary Directory Tree.
 *
 * Returns: Path to root of tree.
 */
char* temptree(char* name_x, char* template_ = null) @safe
{
	return null;
}

/** Returns the path to a new (unique) temporary file.
 *
 * See_Also: https://forum.dlang.org/post/ytmwfzmeqjumzfzxithe@forum.dlang.org
 * See_Also: https://dlang.org/library/std/stdio/file.tmpfile.html
 */
string tempFilePath(string prefix, string extension = null) @safe
{
	import std.uuid : randomUUID;
	import std.file : tempDir;
	import std.path : buildPath;
	/+ TODO: use allocation via lazy range or nxt.appending.append() +/
	return buildPath(tempDir(), prefix ~ "_" ~ randomUUID.toString() ~ extension);
}