import Recording
import SwiftUI

/// The root view of the Attendi sample app.
///
/// The view hosts the `RecordingView` feature from the `Recording` target of the `Features` package, which drives the whole recording flow,
/// and presents the transcribed text of every processed recording in a modal sheet.
struct ContentView: View {

    // MARK: Properties

    /// The transcription currently presented in the modal sheet, or `nil` when none is shown.
    @State private var transcription: Transcription?

    // MARK: Body

    /// The content of the view: the recording feature's view, attached to the microphone-backed recording service and the on-device speech
    /// transcribing service, with the transcribed text of every processed recording presented in a modal sheet.
    var body: some View {
        RecordingView(
            recorder: AudioRecordingService(),
            transcriber: AudioTranscribingService()
        ) { text in
            transcription = .init(text: text)
        }
        .sheet(item: $transcription) { transcription in
            NavigationStack {
                ScrollView {
                    Text(transcription.text)
                        .frame(
                            maxWidth: .infinity,
                            alignment: .leading
                        )
                        .padding()
                }
                .navigationTitle("Transcription")
                #if !os(macOS)
                .navigationBarTitleDisplayMode(.inline)
                #endif
                .toolbar {
                    Button("Done") {
                        self.transcription = nil
                    }
                }
            }
            .presentationDetents([.medium, .large])
        }
    }

}

// MARK: - Models

/// A transcription of a processed recording to present in the modal sheet.
private struct Transcription: Identifiable {
    /// The unique identifier of the transcription.
    let id = UUID()
    /// The transcribed text of the processed recording.
    let text: String
}

// MARK: - Previews

#Preview(
    "Content view"
) {
    ContentView()
}
