#pragma once
#include <Result.h>
#include <Types.h>

namespace MemoryManager
{
    void init();

    Result<void> protect_kernel_sections();

    Result<u64> alloc_frame();
    Result<void> free_frame(u64 frame);

    void lock_frame(u64 frame);
    void lock_frames(u64 frames, u64 count);

    Result<void> remap(u64 address, usize count, int flags);
    Result<void> remap_unaligned(u64 address, usize count, int flags);

    bool validate_readable_page(u64 address);
    bool validate_writable_page(u64 address);

    Result<void> map_frames_at(u64 virt, u64 phys, usize count, int flags);

    Result<u64> alloc_at(u64 virt, usize count, int flags);

    Result<void> unmap_owned(u64 virt, usize count);
    Result<void> unmap_weak(u64 virt, usize count);

    u64 free();
    u64 used();
    u64 reserved();
    u64 total();
}