#ifndef IO_H
#define IO_H

#define PAGE_SIZE  512
#define PAGE_NONE  0 

#define PAGE_PRESENT 1
#define PAGE_DIRTY   2

#define CACHE_ENTRIES 16

#include <stdio.h>
#include <inttypes.h>

extern unsigned reads;
extern unsigned writes;

typedef uint64_t page_t;
typedef uint64_t offset_t;

typedef struct {
    page_t  page;
    size_t  size;
    char    data[PAGE_SIZE];
    uint8_t flags;
} page_cache_entry_t;

typedef struct {
    FILE* file;
    char* filename;

    page_cache_entry_t cache[CACHE_ENTRIES];
} file_t;

file_t* file_open(const char* filename, const char* mode);
void file_close(file_t* file);

size_t file_read(file_t* file, page_t page, void* buffer, size_t size);
size_t file_write(file_t* file, page_t page, const void* buffer, size_t size);

void file_flush(file_t* file);

#endif