#ifndef __DIRECTORY__
#define __DIRECTORY__

#include <string>
#include <memory>
#include <functional>
#include "../define.h"

namespace sleek
{
    namespace io
    {
        class directory : public std::enable_shared_from_this<directory>
        {
            public:
                enum file_type
                {
                    none = 0,
                    not_found = -1,
                    regular = 1,
                    folder = 2,
                    symlink = 3,
                    block = 4,
                    character = 5,
                    fifo = 6,
                    socket = 7,
                    unknown = 8
                };
                struct entry
                {
                    std::string filename;
                    size_t offset;
                    size_t size;
                    file_type type;
                };
            public:
                inline std::shared_ptr<directory> getptr() noexcept
                {
                    return shared_from_this();
                }

                virtual const std::string& filename() const noexcept = 0;

                virtual s32 find(std::function<bool(const entry&)> f) const noexcept = 0;
                virtual entry operator[] (u32 i) const noexcept = 0;

                virtual void refresh() noexcept = 0;
        };
    }
}

#endif // __DIRECTORY__