#pragma once
#include "boot/bootboot.h"
#include <luna/Result.h>
#include <luna/Types.h>

struct MemoryMapEntry
{
    MemoryMapEntry() = default;
    MemoryMapEntry(const MemoryMapEntry& other) = default;
    MemoryMapEntry(u64 address, usize size, bool is_free);

    u64 address() const
    {
        return m_address;
    }

    void* ptr() const
    {
        return (void*)m_address;
    }

    usize size() const
    {
        return m_size;
    }

    bool is_free() const
    {
        return m_is_free;
    }

    MemoryMapEntry& operator=(const MemoryMapEntry& other);

  private:
    u64 m_address;
    usize m_size;
    bool m_is_free;
};

class MemoryMapIterator
{
  public:
    MemoryMapIterator();

    void rewind();

    Result<MemoryMapEntry> next();

    MemoryMapEntry largest_free();

    MemoryMapEntry highest();

    Result<MemoryMapEntry> at(usize index) const;

    usize entries() const
    {
        return m_mmap_entries;
    }

  private:
    const usize m_mmap_entries;
    const MMapEnt* m_base_ent;
    usize m_cur_ent;
};