import Foundation
import NitroModules

/**
 * Factory for creating HybridAudioSession instances.
 * Autolinked — default-constructible (required by Nitrogen).
 *
 * Enforces a single audio session. Only one HybridAudioSession instance may
 * exist at any time. `create()` and `createDefault()` return the existing
 * instance (re-configuring it if a new config is provided). If the existing
 * session has been deallocated, a new one is created.
 */
class HybridAudioSessionFactory: HybridAudioSessionFactorySpec {
    var memorySize: Int {
        MemoryLayout<HybridAudioSessionFactory>.size
    }

    /// Weak reference to the singleton session.
    private weak var instance: HybridAudioSession?

    func create(config: AudioSessionConfig) throws -> any HybridAudioSessionSpec {
        if let existing = instance {
            #if DEBUG
                NSLog("[Aviation] AudioSessionFactory.create() — re-configuring existing singleton session")
            #endif
            _ = try existing.configure(config: config)
            return existing
        }
        let session = HybridAudioSession()
        _ = try session.configure(config: config)
        instance = session
        #if DEBUG
            NSLog("[Aviation] AudioSessionFactory.create() — created new singleton session")
        #endif
        return session
    }

    func createDefault() throws -> any HybridAudioSessionSpec {
        if let existing = instance {
            #if DEBUG
                NSLog("[Aviation] AudioSessionFactory.createDefault() — returning existing singleton session")
            #endif
            return existing
        }
        let session = HybridAudioSession()
        instance = session
        #if DEBUG
            NSLog("[Aviation] AudioSessionFactory.createDefault() — created new singleton session")
        #endif
        return session
    }
}
