#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.
//
// Para plataformas sin backend nativo, el caller puede usar la helper
// file_watcher_events_from_diff que delega en `file_poll_diff` (puro) para
// derivar FileEvents a partir de dos snapshots tomados con stat()/opendir().

#include <cstdint>
#include <string>
#include <vector>

namespace fn {

struct FileWatcher;  // PIMPL

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

// Snapshot de filesystem (forma simple, identica al fn_ui::FileEntry de
// file_poll_diff_cpp_core). Se replica aqui para no acoplar headers en apps.
struct FileSnapshotEntry {
    std::string path;
    uint64_t    size  = 0;
    int64_t     mtime = 0;
};

// 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);

// Helper portable: convierte dos snapshots de FS en FileEvents usando la
// logica pura `file_poll_diff_cpp_core`. Util en plataformas sin inotify/
// RDCW o como fallback de polling. El caller construye los snapshots con
// stat()/opendir().
//
// Mapeo: added -> Created, modified -> Modified, removed -> Deleted.
std::vector<FileEvent> file_watcher_events_from_diff(
    const std::vector<FileSnapshotEntry>& before,
    const std::vector<FileSnapshotEntry>& after);

} // namespace fn
