#pragma once

// file_watcher — watcher cross-platform de archivos/directorios (impure I/O).
//
// Linux:   inotify (mascara IN_MODIFY | IN_CREATE | IN_DELETE | IN_CLOSE_WRITE | IN_MOVED_*)
// Windows: ReadDirectoryChangesW (overlapped, no bloqueante en poll())
// Otros:   stub (poll() devuelve siempre vacio)
//
// API no bloqueante: poll() drena los eventos disponibles desde la ultima llamada.

#include <string>
#include <vector>

namespace fn {

struct FileWatcher;  // PIMPL

struct FileEvent {
    enum Kind { Modified, Created, Deleted };
    std::string path;
    Kind        kind;
};

// Crea un watcher vacio. El caller llama destroy.
FileWatcher* file_watcher_create();

// Libera el watcher (cierra fd / handles). Acepta nullptr.
void file_watcher_destroy(FileWatcher* w);

// Registra un path (archivo o directorio). Devuelve false si no existe o no se pudo
// anadir el watch (ej: en Linux, limite de inotify alcanzado). Tras false, llamar
// file_watcher_last_error() para obtener detalles.
bool file_watcher_add(FileWatcher* w, const char* path);

// Devuelve los eventos acumulados desde la ultima llamada. No bloqueante.
std::vector<FileEvent> file_watcher_poll(FileWatcher* w);

// Devuelve el mensaje del ultimo error (vacio si no hay).
const char* file_watcher_last_error(const FileWatcher* w);

} // namespace fn
