local TEMP_DIR_PATH = "bin/"
local TEMP_ROOT_PATH = TEMP_DIR_PATH .. "fs_copy_test"
local TEMP_ROOT_PATH_2 = TEMP_DIR_PATH .. "fs_copy_test_2"

local fs = require("@lune/fs")
local utils = require("./utils")

-- Make sure our bin dir exists

fs.writeDir(TEMP_DIR_PATH)
if fs.isDir(TEMP_ROOT_PATH) then
	fs.removeDir(TEMP_ROOT_PATH)
end
if fs.isDir(TEMP_ROOT_PATH_2) then
	fs.removeDir(TEMP_ROOT_PATH_2)
end

--[[
	Create a file structure like this:

	-> fs_copy_test
	-- -> foo (dir)
	-- -- -> bar (dir)
	-- -- -- -> baz (file)
	-- -- -> fizz (file)
	-- -- -> buzz (file)

]]

fs.writeDir(TEMP_ROOT_PATH)
fs.writeDir(TEMP_ROOT_PATH .. "/foo")
fs.writeDir(TEMP_ROOT_PATH .. "/foo/bar")
fs.writeFile(TEMP_ROOT_PATH .. "/foo/bar/baz", utils.binaryBlob)
fs.writeFile(TEMP_ROOT_PATH .. "/foo/fizz", utils.binaryBlob)
fs.writeFile(TEMP_ROOT_PATH .. "/foo/buzz", utils.binaryBlob)

-- Copy the entire structure

fs.copy(TEMP_ROOT_PATH, TEMP_ROOT_PATH_2)

-- Verify the copied structure

assert(fs.isDir(TEMP_ROOT_PATH_2), "Missing copied dir - root/")
assert(fs.isDir(TEMP_ROOT_PATH_2 .. "/foo"), "Missing copied dir - root/foo/")
assert(fs.isDir(TEMP_ROOT_PATH_2 .. "/foo/bar"), "Missing copied dir - root/foo/bar/")
assert(fs.isFile(TEMP_ROOT_PATH_2 .. "/foo/bar/baz"), "Missing copied file - root/foo/bar/baz")
assert(fs.isFile(TEMP_ROOT_PATH_2 .. "/foo/fizz"), "Missing copied file - root/foo/fizz")
assert(fs.isFile(TEMP_ROOT_PATH_2 .. "/foo/buzz"), "Missing copied file - root/foo/buzz")

-- Make sure the copied files are correct

assert(
	fs.readFile(TEMP_ROOT_PATH_2 .. "/foo/bar/baz") == buffer.tostring(utils.binaryBlob),
	"Invalid copied file - root/foo/bar/baz"
)
assert(
	fs.readFile(TEMP_ROOT_PATH_2 .. "/foo/fizz") == buffer.tostring(utils.binaryBlob),
	"Invalid copied file - root/foo/fizz"
)
assert(
	fs.readFile(TEMP_ROOT_PATH_2 .. "/foo/buzz") == buffer.tostring(utils.binaryBlob),
	"Invalid copied file - root/foo/buzz"
)

-- Finally, clean up after us for any subsequent tests

fs.removeDir(TEMP_ROOT_PATH)
fs.removeDir(TEMP_ROOT_PATH_2)