import { fs_path_url } from './FilesystemUtil.js'

export const fs_check_response = async resp => {
	let text = await resp.text()
	if (resp.status >= 400) {
		let error
		try {
			error = JSON.parse(text)
		} catch (err) {
			error = text
		}
		throw error
	}
	return JSON.parse(text)
}

export const fs_mkdir = async (path, opts = null) => {
	const form = new FormData()
	form.append("action", "mkdir")

	if (opts && opts.mode) {
		form.append("mode", opts.mode)
	}

	return await fs_check_response(
		await fetch(fs_path_url(path), { method: "POST", body: form })
	)
}

export const fs_mkdirall = async (path, opts = null) => {
	const form = new FormData()
	form.append("action", "mkdirall")

	if (opts && opts.mode) {
		form.append("mode", opts.mode)
	}

	return await fs_check_response(
		await fetch(fs_path_url(path), { method: "POST", body: form })
	)
}

export const fs_get_node = async path => {
	return await fs_check_response(
		await fetch(fs_path_url(path) + "?stat")
	)
}

// Updates a node's parameters. Available options are:
//  - created, Date object
//  - modified, Date object
//  - mode, file mode formatted as octal string
//  - shared, boolean. If true the node will receive a public ID
//
// Returns the modified filesystem node object
export const fs_update = async (path, opts) => {
	const form = new FormData()
	form.append("action", "update")

	if (opts.created !== undefined) {
		form.append("created", opts.created.toISOString())
	}
	if (opts.modified !== undefined) {
		form.append("modified", opts.modified.toISOString())
	}
	if (opts.mode !== undefined) {
		form.append("mode", opts.mode)
	}
	if (opts.shared !== undefined) {
		form.append("shared", opts.shared)
	}

	return await fs_check_response(
		await fetch(fs_path_url(path), { method: "POST", body: form })
	)
}

export const fs_rename = async (old_path, new_path) => {
	const form = new FormData()
	form.append("action", "rename")
	form.append("target", new_path)

	return await fs_check_response(
		await fetch(fs_path_url(old_path), { method: "POST", body: form })
	)
}

export const fs_delete = async path => {
	return await fs_check_response(
		await fetch(fs_path_url(path), { method: "DELETE" })
	)
}
export const fs_delete_all = async path => {
	return await fs_check_response(
		await fetch(fs_path_url(path) + "?recursive", { method: "DELETE" })
	)
}

export const fs_search = async (path, term, limit = 10) => {
	return await fs_check_response(
		await fetch(
			fs_path_url(path) +
			"?search=" + encodeURIComponent(term) +
			"&limit=" + limit
		)
	)
}

export const fs_timeseries = async (path, start, end, interval = 60) => {
	return await fs_check_response(
		await fetch(
			fs_path_url(path) +
			"?timeseries" +
			"&start=" + start.toISOString() +
			"&end=" + end.toISOString() +
			"&interval=" + interval
		)
	)
}
