#include <fs_util.h>
#include <ff.h>
#include <stdint.h>
#include <string.h>

FATFS FatFs;          /* File system object for logical drive */
FS_USAGE FsUsage;


int fs_info(FATFS *fs)
{
    memcpy(fs, &FatFs, sizeof(FATFS));
    return 0;
}
int fs_usage(FATFS *fs, FS_USAGE *fs_usage)
{
    FRESULT res;
    DWORD tot_clust, fre_clust, sec_size;

    res = f_getfree("/", &fre_clust, &fs);
    if(res != FR_OK)
        return -res;

    // sectore size = sectors per cluster *  sector size
#if FF_MAX_SS == FF_MIN_SS
    sec_size = fs->csize * FF_MAX_SS;
#else
    sec_size = fs->csize * fs.ssize;
#endif

    // total/free sectors * sectore size
    tot_clust = fs->n_fatent - 2;
    fs_usage->total = tot_clust * sec_size; //FatFs.ssize;
    fs_usage->free = fre_clust * sec_size; //FatFs.ssize;

    return 0;
}

int fs_read_file(char * filename, void * data, int len){
    FIL file;
    UINT readbytes;
    int res;

    res=f_open(&file, filename, FA_OPEN_EXISTING|FA_READ);
    if(res){
        return -1;
    };

    res = f_read(&file, data, len, &readbytes);
    if(res){
        return -1;
    };

    f_close(&file);

	return readbytes;
}

int fs_read_text_file(char * filename, char * data, int len){
    int readbytes;

    if(len<1) return -1;
    readbytes=fs_read_file(filename,data,len-1);
    if(readbytes<0){
        data[0]=0;
        return readbytes;
    };
    data[readbytes]=0;
    while(readbytes>0 && data[readbytes-1]<0x20){
        data[--readbytes]=0;
    };
    return readbytes;
}


int fs_write_file(char * filename, const void * data, int len){
    FIL file;
    UINT writebytes;
    int res;

	res=f_open(&file, filename, FA_CREATE_ALWAYS|FA_WRITE);
    if(res){
        return -res;
    };

    res = f_write(&file, data, len, &writebytes);
    if(res){
        return -res;
    };
    f_close(&file);

	return writebytes;
}

int fs_get_file_size(char * filename){
    FILINFO finfo;
    int res;

    /// XXX: Untested
    res=f_stat(filename, &finfo);
    if(res){
        return -1;
    }

    return finfo.fsize;
}