import time
from collections.abc import Callable

from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer


class EventCaptureHandler(FileSystemEventHandler):
    def __init__(self, callback: Callable):
        self.callback = callback

    def on_modified(self, event):
        if not event.is_directory:
            self._emit("modified", event.src_path)

    def on_created(self, event):
        if not event.is_directory:
            self._emit("created", event.src_path)

    def on_deleted(self, event):
        if not event.is_directory:
            self._emit("deleted", event.src_path)

    def on_moved(self, event):
        if not event.is_directory:
            self._emit("moved", event.dest_path)

    def _emit(self, action, path):
        self.callback(
            {
                "type": "file_change",
                "timestamp_ms": int(time.time() * 1000),
                "path": path,
                "action": action,
            }
        )


def start_fs_watcher(path: str, callback: Callable):
    event_handler = EventCaptureHandler(callback)
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    return observer
