/*
 * Copyright (c) 2018-2020 Atmosphère-NX
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see .
 */
#pragma once
#include "fs_common.hpp"
namespace ams::fs {
    namespace fsa {
        class IFile;
    }
    enum OpenMode {
        OpenMode_Read   = (1 << 0),
        OpenMode_Write  = (1 << 1),
        OpenMode_AllowAppend = (1 << 2),
        OpenMode_ReadWrite = (OpenMode_Read | OpenMode_Write),
        OpenMode_All       = (OpenMode_ReadWrite | OpenMode_AllowAppend),
    };
    enum OpenDirectoryMode {
        OpenDirectoryMode_Directory = ::FsDirOpenMode_ReadDirs,
        OpenDirectoryMode_File      = ::FsDirOpenMode_ReadFiles,
        OpenDirectoryMode_All = (OpenDirectoryMode_Directory | OpenDirectoryMode_File),
        /* TODO: Separate enum, like N? */
        OpenDirectoryMode_NotRequireFileSize = ::FsDirOpenMode_NoFileSize,
    };
    enum DirectoryEntryType {
        DirectoryEntryType_Directory = ::FsDirEntryType_Dir,
        DirectoryEntryType_File      = ::FsDirEntryType_File,
    };
    enum CreateOption {
        CreateOption_None    = 0,
        CreateOption_BigFile = ::FsCreateOption_BigFile,
    };
    using FileTimeStampRaw = ::FsTimeStampRaw;
    struct FileHandle;
    struct DirectoryHandle;
    Result CreateFile(const char *path, s64 size);
    Result CreateFile(const char* path, s64 size, int option);
    Result DeleteFile(const char *path);
    Result CreateDirectory(const char *path);
    Result DeleteDirectory(const char *path);
    Result DeleteDirectoryRecursively(const char *path);
    Result RenameFile(const char *old_path, const char *new_path);
    Result RenameDirectory(const char *old_path, const char *new_path);
    Result GetEntryType(DirectoryEntryType *out, const char *path);
    Result OpenFile(FileHandle *out_file, const char *path, int mode);
    Result OpenDirectory(DirectoryHandle *out_dir, const char *path, int mode);
    Result CleanDirectoryRecursively(const char *path);
    Result GetFreeSpaceSize(s64 *out, const char *path);
    Result GetTotalSpaceSize(s64 *out, const char *path);
    Result SetConcatenationFileAttribute(const char *path);
    Result GetFileTimeStampRaw(FileTimeStampRaw *out, const char *path);
    Result OpenFile(FileHandle *out, std::unique_ptr &&file, int mode);
}