#pragma once

struct FileIter {
    bool   is_valid;
    bool   is_directory;
    String absolute_path;
    String relative_path;
    String filename;

    String    path;
    Allocator allocator;
    union {
        struct Win32_FileIter *w32;
        void                  *dir;
    };
};

String   ReadFile(Allocator arena, String path);
bool     WriteFile(String path, String data);
String   GetAbsolutePath(Allocator arena, String relative);
bool     IsValid(const FileIter &it);
void     Advance(FileIter *it);
FileIter IterateFiles(Allocator allocator, String path);
void     InitOS(void (*error_proc)(const char *, ...));

bool DeleteFile(String path);
String  GetExePath(Allocator allocator);
String  GetExeDir(Allocator allocator);
bool    FileExists(String path);
bool    IsDir(String path);
bool    IsFile(String path);
String  GetWorkingDir(Allocator arena);
bool    IsAbsolute(String path);
int64_t GetFileModTime(String file);

struct Process {
    bool is_valid;
    int  exit_code;
    char platform[6 * 8];
    int64_t id;

    int64_t view_id; // text editor view
    bool    scroll_to_end;
};

Process SpawnProcess(String command_line, String working_dir, String write_stdin = {}, Array<String> enviroment = {});
bool    IsValid(Process *process);
void    KillProcess(Process *process);
String  PollStdout(Allocator allocator, Process *process, bool force_read);
void    WriteStdin(Process *process, String string);
void    CloseStdin(Process *process);
double GetTimeMicros(void);

enum MakeDirResult {
    MakeDirResult_Success,
    MakeDirResult_Exists,
    MakeDirResult_NotFound,
    MakeDirResult_ErrorOther,
};

MakeDirResult MakeDir(String path);