import type event from "node:events";
import { FSWatcher, watch } from "node:fs";
import { promises } from "node:fs";
import { join } from "node:path";
import type { DocumentAccessor } from "../model/doc";

const readdir = promises.readdir;

export interface DiffWatcherEvent {
	create: (path: string) => void;
	delete: (path: string) => void;
	change: (prev_path: string, cur_path: string) => void;
}

export interface IDiffWatcher extends event.EventEmitter {
	on<U extends keyof DiffWatcherEvent>(event: U, listener: DiffWatcherEvent[U]): this;
	emit<U extends keyof DiffWatcherEvent>(event: U, ...arg: Parameters<DiffWatcherEvent[U]>): boolean;
	setup(cntr: DocumentAccessor): Promise<void>;
}

export function linkWatcher(fromWatcher: IDiffWatcher, toWatcher: IDiffWatcher) {
	fromWatcher.on("create", (p) => toWatcher.emit("create", p));
	fromWatcher.on("delete", (p) => toWatcher.emit("delete", p));
	fromWatcher.on("change", (p, c) => toWatcher.emit("change", p, c));
}