#ifndef __STD_DIRECTORY__
#define __STD_DIRECTORY__

#include <vector>
#include "../directory.h"

#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;

namespace sleek
{
    namespace io
    {
        class std_directory : public directory
        {
            public:
                std_directory(const std::string &filename) : dir(filename)
                {
                    refresh();
                }

                ~std_directory()
                {
                }

                virtual bool is_open() const noexcept
                {
                    return open;
                }

                virtual const std::string& filename() const noexcept
                {
                    return dir;
                }

                virtual s32 find(std::function<bool(const directory::entry&)> f) const noexcept
                {
                    int i = 0;

                    for(auto e : file)
                    {
                        if(f(e))
                            return i;
                        ++i;
                    }

                    return -1;
                }

                virtual directory::entry operator[] (u32 i) const noexcept
                {
                    return file[i];
                }

                virtual void refresh() noexcept
                {
                    file.clear();
                    for(auto& p: fs::directory_iterator(dir))
                    {
                        file.push_back(directory::entry{
                            p.path().filename(), 0, 0,
                            (file_type)p.status().type()
                        });
                    }
                }
            private:
                std::vector<directory::entry> file;
                std::string dir;
                bool open;
        };
    }
}

#endif // __DIRECTORY__