#pragma once

#include <lvgl.h>

#ifdef __cplusplus
extern "C"
{
#endif
    void fs_mount(void);
    void fs_unmount(void);

    /**
     * Öffnet eine Datei.
     * @param drv Zeiger auf den Treiber
     * @param path Pfad zur Datei
     * @param mode LV_FS_MODE_RD für Lesen, LV_FS_MODE_WR für Schreiben
     * @return Zeiger auf ein Datei-Objekt im Erfolgsfall, sonst NULL
     */
    void *fs_open(lv_fs_drv_t *drv, const char *path, lv_fs_mode_t mode);

    /**
     * Schließt eine geöffnete Datei.
     * @param drv Zeiger auf den Treiber
     * @param file_p Zeiger auf das Datei-Objekt
     * @return LV_FS_RES_OK im Erfolgsfall, sonst Fehlercode
     */
    lv_fs_res_t fs_close(lv_fs_drv_t *drv, void *file_p);

    /**
     * Liest Daten aus einer Datei.
     * @param drv Zeiger auf den Treiber
     * @param file_p Zeiger auf das Datei-Objekt
     * @param buf Puffer, in den die Daten gelesen werden
     * @param btr Anzahl der zu lesenden Bytes (Bytes to Read)
     * @param br Zeiger, in den die Anzahl der tatsächlich gelesenen Bytes geschrieben wird
     * @return LV_FS_RES_OK im Erfolgsfall, sonst Fehlercode
     */
    lv_fs_res_t fs_read(lv_fs_drv_t *drv, void *file_p, void *buf, uint32_t btr, uint32_t *br);

    /**
     * Setzt den Lese-/Schreibzeiger in der Datei.
     * @param drv Zeiger auf den Treiber
     * @param file_p Zeiger auf das Datei-Objekt
     * @param pos Position, zu der gesprungen werden soll
     * @param whence Startpunkt: LV_FS_SEEK_SET (Anfang), LV_FS_SEEK_CUR (aktuell), LV_FS_SEEK_END (Ende)
     * @return LV_FS_RES_OK im Erfolgsfall, sonst Fehlercode
     */
    lv_fs_res_t fs_seek(lv_fs_drv_t *drv, void *file_p, uint32_t pos, lv_fs_whence_t whence);

    /**
     * Gibt die aktuelle Position des Lese-/Schreibzeigers zurück.
     * @param drv Zeiger auf den Treiber
     * @param file_p Zeiger auf das Datei-Objekt
     * @param pos_p Zeiger, in den die aktuelle Position geschrieben wird
     * @return LV_FS_RES_OK im Erfolgsfall, sonst Fehlercode
     */
    lv_fs_res_t fs_tell(lv_fs_drv_t *drv, void *file_p, uint32_t *pos_p);

    /******* */
    void setup_fatfs();
#ifdef __cplusplus
} // extern "C"
#endif
