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

/* /dev/tty implementation. */
class TTYLink : public VFS::DeviceInode
{
  public:
    TTYLink();

    VFS::InodeType type() const override
    {
        return VFS::InodeType::CharacterDevice;
    }

    void set_fs(VFS::FileSystem& fs)
    {
        m_fs = &fs;
    }

    void set_inode_number(usize inum)
    {
        m_metadata.inum = inum;
    }

    Result<u64> query_shared_memory(off_t, usize) override
    {
        unreachable();
    }

    Result<SharedPtr<VFS::Inode>> open() override;

    VFS::FileSystem* fs() const override
    {
        return m_fs;
    }

    Result<usize> read(u8*, usize, usize) const override
    {
        unreachable();
    }

    Result<usize> write(const u8*, usize, usize) override
    {
        unreachable();
    }

    Result<void> truncate(usize) override
    {
        // POSIX says truncate is for regular files, but doesn't tell us what error to return for non-regular files.
        return err(EINVAL);
    }

    bool will_block_if_read() const override
    {
        unreachable();
    }

    void did_link() override
    {
        m_metadata.nlinks++;
    }

    void did_unlink() override
    {
        m_metadata.nlinks--;
    }

    virtual ~TTYLink() = default;

  private:
    VFS::FileSystem* m_fs;
};