import Foundation
import NitroModules

/**
 * HybridMediaItem — Stateless descriptor of media content.
 *
 * Wraps an AVURLAsset reference on iOS. Immutable after creation.
 * HybridObject so it can be passed by reference between Player, Queue,
 * and NowPlayingController without serialization.
 */
class HybridMediaItem: HybridMediaItemSpec {
    // MARK: - HybridObject

    var memorySize: Int {
        var size: Int = MemoryLayout<HybridMediaItem>.size
        size += uri.utf8.count
        size += title?.utf8.count ?? 0
        size += artist?.utf8.count ?? 0
        size += album?.utf8.count ?? 0
        size += artworkUri?.utf8.count ?? 0
        size += mimeType?.utf8.count ?? 0
        return size
    }

    // MARK: - Properties (all readonly, set once at init)

    let uri: String
    let mediaType: MediaType?
    let mimeType: String?
    let title: String?
    let artist: String?
    let album: String?
    let artworkUri: String?
    let durationMs: Double
    let hasDrm: Bool
    let drmType: DrmType?

    // MARK: - Internal (for platform adapter access)

    /// Custom HTTP headers for the request.
    let headers: [String: String]?

    /// DRM license server URI.
    let drmLicenseUri: String?

    /// Custom HTTP headers for DRM license requests.
    let drmHeaders: [String: String]?

    /// Start position for clipping, in milliseconds.
    let startPositionMs: Double?

    /// End position for clipping, in milliseconds.
    let endPositionMs: Double?

    // MARK: - Init

    init(config: MediaItemConfig) {
        uri = config.uri
        mediaType = config.mediaType
        mimeType = config.mimeType
        title = config.title
        artist = config.artist
        album = config.album
        artworkUri = config.artworkUri
        durationMs = config.duration ?? 0
        drmType = config.drmType
        hasDrm = config.drmType != nil
        headers = config.headers
        drmLicenseUri = config.drmLicenseUri
        drmHeaders = config.drmHeaders
        startPositionMs = config.startPositionMs
        endPositionMs = config.endPositionMs
        super.init()
    }

    /// Convenience init for a simple URI with no metadata.
    init(uri: String) {
        self.uri = uri
        mediaType = nil
        mimeType = nil
        title = nil
        artist = nil
        album = nil
        artworkUri = nil
        durationMs = 0
        hasDrm = false
        drmType = nil
        headers = nil
        drmLicenseUri = nil
        drmHeaders = nil
        startPositionMs = nil
        endPositionMs = nil
        super.init()
    }
}
