import fs from "node:fs"
import path from "node:path"
import pMap from "p-map"

export default async function putObject({
	filePath,
	uploadPath,
	metadata = {},
	targetFilename,
	onFinish,
	provider = "standard",
}) {
	const providerClass = global.storages[provider]

	if (!providerClass) {
		throw new Error(`Provider [${provider}] not found`)
	}

	const isDirectory = await fs.promises
		.lstat(filePath)
		.then((stats) => stats.isDirectory())

	if (isDirectory) {
		let files = await fs.promises.readdir(filePath)

		files = files.map((file) => {
			const newPath = path.join(filePath, file)

			return {
				filePath: newPath,
				uploadPath: path.join(uploadPath, file),
			}
		})

		await pMap(files, putObject, {
			concurrency: 3,
		})

		return {
			id: uploadPath,
			url: providerClass.composeRemoteURL(uploadPath, targetFilename),
			metadata: metadata,
		}
	}

	// upload to storage
	await providerClass.fPutObject(
		process.env.S3_BUCKET,
		uploadPath,
		filePath,
		metadata,
	)

	const result = {
		id: uploadPath,
		url: providerClass.composeRemoteURL(uploadPath),
		metadata: metadata,
	}

	if (typeof onFinish === "function") {
		await onFinish(result)
	}

	return result
}