import AVFoundation

/**
 * LoadContext — Mutable context flowing through the interceptor chain.
 *
 * Reference type (class, not struct) so interceptors can mutate shared state.
 * Source data (uri, mediaType, nativeItem, hasDrm, isLive) is set once in init
 * and should be treated as immutable. Mutable properties (preparedAsset,
 * contentKeySession, cacheHit, preloadedItem) are set by interceptors in
 * later phases.
 */
class LoadContext {
    // Source data (immutable, from command event)
    let uri: String
    let mediaType: Int32
    let nativeItem: HybridMediaItem?

    // Derived flags (immutable, computed once)
    let hasDrm: Bool
    let isLive: Bool
    let isVideo: Bool
    /// True for HLS/DASH content (adaptive streaming manifests). These are
    /// fundamentally incompatible with AVAssetResourceLoaderDelegate because
    /// the delegate only intercepts the initial manifest request — segment
    /// URLs inside the manifest use the original scheme and bypass the delegate.
    /// Attempting to cache HLS via the resource loader can also interfere with
    /// AVPlayer's internal adaptive streaming engine, causing crashes.
    let isAdaptiveStream: Bool

    // Mutable state set by interceptors in later phases
    var preparedAsset: AVURLAsset?
    var contentKeySession: AVContentKeySession?
    var cacheHit: Bool = false
    var preloadedItem: AVPlayerItem?

    init(event: AviationCommandEvent, nativeItem: HybridMediaItem?) {
        uri = String(cCharArray: event.uri)
        mediaType = event.mediaType
        self.nativeItem = nativeItem
        hasDrm = nativeItem?.hasDrm ?? false
        isLive = nativeItem?.mediaType == .audiolive || nativeItem?.mediaType == .videolive

        // Detect video content: explicit mediaType or URI extension fallback
        let explicitVideo = nativeItem?.mediaType == .videoondemand || nativeItem?.mediaType == .videolive
        let uriLower = uri.lowercased()
        let videoExtensions = [".mp4", ".mov", ".m4v", ".avi", ".mkv", ".webm"]
        let extensionVideo = videoExtensions.contains(where: { uriLower.hasSuffix($0) || uriLower.contains("\($0)?") })
        isVideo = explicitVideo || extensionVideo

        // Detect adaptive streaming content (HLS / DASH manifests).
        // AVAssetResourceLoaderDelegate is incompatible with adaptive streams:
        // it only intercepts the custom-scheme manifest request, but segment
        // URLs inside use the original scheme and bypass the delegate entirely.
        let adaptiveExtensions = [".m3u8", ".mpd"]
        isAdaptiveStream = adaptiveExtensions.contains(where: { uriLower.hasSuffix($0) || uriLower.contains("\($0)?") })
    }
}
