#pragma once
#include "fs/VFS.h"
#include "fs/devices/DeviceRegistry.h"
#include <luna/Atomic.h>

namespace TmpFS
{
    class FileSystem : public VFS::FileSystem
    {
      public:
        SharedPtr<VFS::Inode> root_inode() const override
        {
            return m_root_inode;
        }

        Result<SharedPtr<VFS::Inode>> create_file_inode(mode_t mode) override;
        Result<SharedPtr<VFS::Inode>> create_dir_inode(SharedPtr<VFS::Inode> parent, mode_t mode) override;
        Result<SharedPtr<VFS::Inode>> create_device_inode(u32 major, u32 minor, mode_t mode) override;
        Result<SharedPtr<VFS::Inode>> create_symlink_inode(StringView link) override;

        Result<u64> allocate_inode_number() override;

        Result<void> set_mount_dir(SharedPtr<VFS::Inode> parent) override;

        Result<void> reset_mount_dir() override;

        static Result<SharedPtr<VFS::FileSystem>> create();

        dev_t host_device_id() const override
        {
            return m_host_device_id;
        }

        virtual ~FileSystem() = default;

      private:
        FileSystem();

        void set_root(SharedPtr<VFS::Inode> root);

        SharedPtr<VFS::Inode> m_root_inode;

        Atomic<usize> m_next_inode_number { 2 };

        dev_t m_host_device_id;
    };
}