import Foundation

func runIPCLab() throws {
    labHeader(
        "IPC · Bytes cross a process boundary",
        mechanism: "Processes do not share ordinary object references; a protocol must serialize values and model failure."
    )

    let child = Process()
    let input = Pipe()
    let output = Pipe()
    child.executableURL = URL(fileURLWithPath: "/usr/bin/tr")
    child.arguments = ["a-z", "A-Z"]
    child.standardInput = input
    child.standardOutput = output

    try child.run()
    let message = "framework request: render timeline\n"
    input.fileHandleForWriting.write(Data(message.utf8))
    try input.fileHandleForWriting.close()

    let response = output.fileHandleForReading.readDataToEndOfFile()
    child.waitUntilExit()

    print("Parent PID: \(ProcessInfo.processInfo.processIdentifier)")
    print("Child PID:  \(child.processIdentifier)")
    print("Request:    \(message.trimmingCharacters(in: .whitespacesAndNewlines))")
    print("Response:   \(String(decoding: response, as: UTF8.self).trimmingCharacters(in: .whitespacesAndNewlines))")
    print("Exit status: \(child.terminationStatus)")
    print("Observation: this tiny pipe still needs encoding, lifecycle, EOF, and exit-status handling.")
    print("Interview link: XPC adds a typed Apple IPC model, but cancellation, invalidation, and versioning remain API work.")
}
