import Foundation

/// A service that captures audio from a microphone for the Recording feature.
///
/// ``RecordingView`` attaches the service to its model at initialization, so the audio capture can be swapped without touching the feature's
/// state machine — for example, with a real microphone backend in the app, or with a mock in unit tests.
public protocol RecordingService: Sendable {

    /// Starts a new audio recording from the microphone.
    func start() async throws

    /// Pauses the ongoing recording.
    func pause() async throws

    /// Resumes a paused recording.
    func resume() async throws

    /// Stops the recording.
    ///
    /// - Returns: The audio captured since the recording started.
    func stop() async throws -> Data

}

// MARK: - Services

/// The recording service used by default, which simulates the audio capture without touching a microphone.
public struct SimulatedRecordingService: RecordingService {

    // MARK: Initializers

    /// Creates a simulated recording service.
    public init() {}

    // MARK: Methods

    /// Simulates the start of an audio recording.
    public func start() async throws {}

    /// Simulates the pause of an ongoing recording.
    public func pause() async throws {}

    /// Simulates the resumption of a paused recording.
    public func resume() async throws {}

    /// Simulates the stop of a recording.
    ///
    /// - Returns: An empty audio payload.
    public func stop() async throws -> Data {
        .init()
    }

}
