import * as fs from "node:fs/promises";
import * as npath from "node:path";
import { BACKEND_STATUS, type BackendConfig } from "@ironmount/schemas";
import type { VolumeBackend } from "../backend";
import { logger } from "../../../utils/logger";
import { toMessage } from "../../../utils/errors";

const mount = async (_config: BackendConfig, path: string) => {
	logger.info("Mounting directory volume...");
	await fs.mkdir(path, { recursive: true });
	return { status: BACKEND_STATUS.mounted };
};

const unmount = async () => {
	logger.info("Cannot unmount directory volume.");
	return { status: BACKEND_STATUS.unmounted };
};

const checkHealth = async (path: string) => {
	try {
		await fs.access(path);

		// Try to create a temporary file to ensure write access
		const tempFilePath = npath.join(path, `.healthcheck-${Date.now()}`);
		await fs.writeFile(tempFilePath, "healthcheck");
		await fs.unlink(tempFilePath);

		return { status: BACKEND_STATUS.mounted };
	} catch (error) {
		logger.error("Directory health check failed:", error);
		return { status: BACKEND_STATUS.error, error: toMessage(error) };
	}
};

export const makeDirectoryBackend = (config: BackendConfig, path: string): VolumeBackend => ({
	mount: () => mount(config, path),
	unmount,
	checkHealth: () => checkHealth(path),
});
