import Darwin
import Foundation

private enum VirtualMemoryError: Error, CustomStringConvertible {
    case mappingFailed(Int32)

    var description: String {
        switch self {
        case .mappingFailed(let code):
            return "mmap failed with errno \(code)"
        }
    }
}

private func peakResidentBytes() -> Int64 {
    var usage = rusage()
    guard getrusage(RUSAGE_SELF, &usage) == 0 else { return -1 }
    return Int64(usage.ru_maxrss)
}

private func bytesLabel(_ value: Int64) -> String {
    guard value >= 0 else { return "unavailable" }
    return String(format: "%.1f MiB", Double(value) / 1_048_576)
}

func runVirtualMemoryLab() throws {
    labHeader(
        "VIRTUAL MEMORY · Reserved address space versus resident pages",
        mechanism: "mmap reserves a virtual region; physical pages become resident when the process touches them."
    )

    let regionSize = 64 * 1_024 * 1_024
    let pageSize = Int(sysconf(_SC_PAGESIZE))
    let before = peakResidentBytes()

    guard let region = mmap(nil, regionSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0),
          region != MAP_FAILED else {
        throw VirtualMemoryError.mappingFailed(errno)
    }
    defer { munmap(region, regionSize) }

    let reserved = peakResidentBytes()
    let bytes = region.assumingMemoryBound(to: UInt8.self)
    for offset in stride(from: 0, to: regionSize, by: pageSize) {
        bytes[offset] = 1
    }
    let touched = peakResidentBytes()

    print("Page size:                    \(pageSize) bytes")
    print("Reserved virtual region:      64.0 MiB")
    print("Peak RSS before mmap:          \(bytesLabel(before))")
    print("Peak RSS after reservation:    \(bytesLabel(reserved))")
    print("Peak RSS after touching pages: \(bytesLabel(touched))")
    print("Observation: virtual size and physical footprint are related but not interchangeable measurements.")
    print("Interview link: inspect resident and dirty memory over a repeatable scenario, not virtual size alone.")
}
