// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// swift-format-ignore-file

import Foundation
#if canImport(FoundationNetworking)
// URLSession, URLRequest, HTTPURLResponse, and URLSessionTaskDelegate live in
// the FoundationNetworking submodule on swift-corelibs-foundation (Linux). On
// Apple platforms these types remain in plain Foundation and this submodule
// does not exist; the canImport guard skips the import there.
import FoundationNetworking
#endif
import RustBridge

// Make `RustString` print its content in XCTest failure output. Without this,
// every error thrown from the swift-bridge layer surfaces as
// `caught error: "RustBridge.RustString"` with the actual message hidden
// inside the opaque class instance. The `@retroactive` keyword acknowledges
// that the conformed-to protocol (`CustomStringConvertible`) and the
// conforming type (`RustString`) both live outside this module — required by
// Swift 6 to silence the retroactive-conformance warning. swift-bridge does
// not give `RustString` a `description` of its own, so there is no conflict.
extension RustString: @retroactive CustomStringConvertible {
    public var description: String { self.toString() }
}

// Spawns the alef mock-server once per test process and exposes its base URL.
// SwiftPM/XCTest has no global "before all tests" hook that can inject environment
// variables (the JVM-style listener trick used by the Java/Kotlin backends), so the
// server is started lazily on first access of `baseURL` and kept alive for the
// lifetime of the process. A pre-set `MOCK_SERVER_URL` (e.g. exported by CI) wins.
enum AlefE2EMockServer {
    static let baseURL: String = AlefE2EMockServer.start()

    // Retain the child process so it is not reaped while tests run.
    nonisolated(unsafe) private static var process: Process?

    private static func start() -> String {
        if let preset = ProcessInfo.processInfo.environment["MOCK_SERVER_URL"], !preset.isEmpty {
            return preset
        }
        let fileManager = FileManager.default
        var dir = URL(fileURLWithPath: fileManager.currentDirectoryPath)
        var fixturesDir: URL?
        for _ in 0..<16 {
            let candidate = dir.appendingPathComponent("fixtures")
            var isDir: ObjCBool = false
            if fileManager.fileExists(atPath: candidate.path, isDirectory: &isDir), isDir.boolValue {
                fixturesDir = candidate
                break
            }
            let parent = dir.deletingLastPathComponent()
            if parent.path == dir.path { break }
            dir = parent
        }
        guard let fixtures = fixturesDir else {
            fatalError("AlefE2EMockServer: could not locate fixtures/ above \(fileManager.currentDirectoryPath)")
        }
        let repoRoot = fixtures.deletingLastPathComponent()
        let binary = repoRoot.appendingPathComponent("e2e/rust/target/release/mock-server")
        guard fileManager.fileExists(atPath: binary.path) else {
            fatalError("AlefE2EMockServer: mock-server binary not found at \(binary.path) — run: cargo build --manifest-path e2e/rust/Cargo.toml --bin mock-server --release")
        }
        let proc = Process()
        proc.executableURL = binary
        proc.arguments = [fixtures.path]
        let stdoutPipe = Pipe()
        proc.standardOutput = stdoutPipe
        // Keep stdin open so the server does not see EOF and exit immediately.
        proc.standardInput = Pipe()
        do {
            try proc.run()
        } catch {
            fatalError("AlefE2EMockServer: failed to start mock-server: \(error)")
        }
        process = proc
        let handle = stdoutPipe.fileHandleForReading
        var buffer = Data()
        var resolved: String?
        for _ in 0..<500 {
            let chunk = handle.availableData
            if chunk.isEmpty { break }
            buffer.append(chunk)
            if let text = String(data: buffer, encoding: .utf8) {
                for line in text.split(separator: "\n") {
                    if line.hasPrefix("MOCK_SERVER_URL=") {
                        resolved = String(line.dropFirst("MOCK_SERVER_URL=".count)).trimmingCharacters(in: .whitespacesAndNewlines)
                        break
                    }
                }
            }
            if resolved != nil { break }
        }
        guard let url = resolved else {
            proc.terminate()
            fatalError("AlefE2EMockServer: mock-server did not emit MOCK_SERVER_URL")
        }
        // Drain remaining stdout in the background so a full pipe never blocks the server.
        DispatchQueue.global(qos: .background).async {
            while !handle.availableData.isEmpty {}
        }
        return url
    }
}

// URLSession that does not follow redirects, so tests can assert on 3xx status codes
// and Location headers instead of transparently chasing them to the final response.
final class AlefE2ENoRedirectDelegate: NSObject, URLSessionTaskDelegate {
    func urlSession(
        _ session: URLSession,
        task: URLSessionTask,
        willPerformHTTPRedirection response: HTTPURLResponse,
        newRequest request: URLRequest,
        completionHandler: @escaping (URLRequest?) -> Void
    ) {
        completionHandler(nil)
    }
}

let alefE2ESession = URLSession(
    configuration: .ephemeral,
    delegate: AlefE2ENoRedirectDelegate(),
    delegateQueue: nil
)
