in "//
//  TwoWayConversationView.swift
//  QuickAid
//
//  Created by Suryansh Malik on 11/10/24.
//

import SwiftUI
import AVFoundation

struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
    @State private var showInfoView = false
    @State private var person1Text = ""
    @State private var person1Language = "English"
    @State private var person2Text = ""
    @State private var person2Language = "English"
    private let speechSynthesizer = AVSpeechSynthesizer()
    
    let languages = ["English", "Spanish", "French", "Hindi", "Chinese", "Arabic"]
    @State private var selectedTab = 0 // 0 for Person 1, 1 for Person 2
    @State private var previousTab = 0 // To keep track of the previous tab
    
    // For Person 1
    @State private var person1LastActivity = Date()
    @State private var person1AlertHandled = false
    @State private var person1IsPlaying = false
    
    // For Person 2
    @State private var person2LastActivity = Date()
    @State private var person2AlertHandled = false
    @State private var person2IsPlaying = false
    
    // Active alert
    @State private var activeAlert: PersonAlert?
    
    // Timer
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    
    // Recents
    @State private var person1Recents: [RecentMessage] = []
    @State private var person2Recents: [RecentMessage] = []
    
    // Navigation Path
    @State private var navigationPath = NavigationPath()
    
    // Current person playing
    @State private var currentPersonPlaying: Int? = nil // 1 for Person 1, 2 for Person 2
    
    var body: some View {
        NavigationStack(path: $navigationPath) {
            ZStack {
                // Gradient Background at the top
                VStack {
                    LinearGradient(
                        gradient: Gradient(colors: [Color.red.opacity(0.8), Color.black.opacity(0.8)]),
                        startPoint: .top,
                        endPoint: .bottom
                    )
                    .frame(height: UIScreen.main.bounds.height * 0.20)
                    .ignoresSafeArea(edges: .top)
                    Spacer()
                }
                // Content starts just below the gradient
                VStack(spacing: 20) {
                    TabView(selection: $selectedTab) {
                        // Person 1 View
                        VStack(alignment: .leading, spacing: 15) {
                            // Title
                            Text("Person 1")
                                .font(.largeTitle)
                                .padding(.leading)
                                .fontWeight(.bold)
                            
                            // HStack for Language Picker, Clear Button, and Recents Button
                            HStack {
                                // Language Picker (drop-down)
                                Picker("Language", selection: $person1Language) {
                                    ForEach(languages, id: \.self) { language in
                                        Text(language)
                                    }
                                }
                                .pickerStyle(MenuPickerStyle())
                                .onChange(of: person1Language) { _ in
                                    person1LastActivity = Date()
                                    person1AlertHandled = false
                                    if person1IsPlaying {
                                        person1IsPlaying = false
                                        speechSynthesizer.stopSpeaking(at: .immediate)
                                    }
                                    addToRecents(person: 1)
                                }
                                
                                // Clear Button
                                Button(action: {
                                    person1Text = ""
                                    person1LastActivity = Date()
                                    person1AlertHandled = false
                                    if person1IsPlaying {
                                        person1IsPlaying = false
                                        speechSynthesizer.stopSpeaking(at: .immediate)
                                    }
                                }) {
                                    Image(systemName: "arrow.counterclockwise")
                                        .foregroundColor(person1Text.isEmpty ? .gray : .white)
                                }
                                .disabled(person1Text.isEmpty)
                                
                                Spacer() // Pushes the Recents button to the far right
                                
                                // Recents Button
                                Button(action: {
                                    person1LastActivity = Date()
                                    person1AlertHandled = false
                                    if person1IsPlaying {
                                        person1IsPlaying = false
                                        speechSynthesizer.stopSpeaking(at: .immediate)
                                    }
                                    navigationPath.append(RecentsNavigation(person: 1))
                                }) {
                                    Image(systemName: "clock.arrow.trianglehead.counterclockwise.rotate.90")
                                        .foregroundColor(.white)
                                }
                            }
                            .padding(.horizontal)
                            .onTapGesture {
                                person1LastActivity = Date()
                                person1AlertHandled = false
                            }
                            
                            // PersonCard without title and picker
                            PersonCard(
                                text: $person1Text,
                                selectedLanguage: person1Language,
                                isPlaying: $person1IsPlaying,
                                playAction: { speedMultiplier in
                                    playSpeech(person: 1, action: "play", text: person1Text, language: person1Language, speedMultiplier: speedMultiplier)
                                    addToRecents(person: 1)
                                },
                                pauseAction: {
                                    playSpeech(person: 1, action: "pause", text: person1Text, language: person1Language, speedMultiplier: 1.0)
                                },
                                onTap: {
                                    person1LastActivity = Date()
                                    person1AlertHandled = false
                                },
                                onPlay: {
                                    person1LastActivity = Date()
                                    person1AlertHandled = false
                                }
                            )
                        }
                        .tag(0)
                        .onTapGesture {
                            person1LastActivity = Date()
                            person1AlertHandled = false
                        }
                        .onChange(of: person1Text) { _ in
                            person1LastActivity = Date()
                            person1AlertHandled = false
                            if person1IsPlaying {
                                person1IsPlaying = false
                                speechSynthesizer.stopSpeaking(at: .immediate)
                            }
                        }
                        
                        // Person 2 View
                        VStack(alignment: .leading, spacing: 15) {
                            // Title
                            Text("Person 2")
                                .font(.largeTitle)
                                .padding(.leading)
                                .fontWeight(.bold)
                            
                            // HStack for Language Picker, Clear Button, and Recents Button
                            HStack {
                                // Language Picker (drop-down)
                                Picker("Language", selection: $person2Language) {
                                    ForEach(languages, id: \.self) { language in
                                        Text(language)
                                    }
                                }
                                .pickerStyle(MenuPickerStyle())
                                .onChange(of: person2Language) { _ in
                                    person2LastActivity = Date()
                                    person2AlertHandled = false
                                    if person2IsPlaying {
                                        person2IsPlaying = false
                                        speechSynthesizer.stopSpeaking(at: .immediate)
                                    }
                                    addToRecents(person: 2)
                                }
                                
                                // Clear Button
                                Button(action: {
                                    person2Text = ""
                                    person2LastActivity = Date()
                                    person2AlertHandled = false
                                    if person2IsPlaying {
                                        person2IsPlaying = false
                                        speechSynthesizer.stopSpeaking(at: .immediate)
                                    }
                                }) {
                                    Image(systemName: "arrow.counterclockwise")
                                        .foregroundColor(person2Text.isEmpty ? .gray : .white)
                                }
                                .disabled(person2Text.isEmpty)
                                
                                Spacer() // Pushes the Recents button to the far right
                                
                                // Recents Button
                                Button(action: {
                                    person2LastActivity = Date()
                                    person2AlertHandled = false
                                    if person2IsPlaying {
                                        person2IsPlaying = false
                                        speechSynthesizer.stopSpeaking(at: .immediate)
                                    }
                                    navigationPath.append(RecentsNavigation(person: 2))
                                }) {
                                    Image(systemName: "clock.arrow.trianglehead.counterclockwise.rotate.90")
                                        .foregroundColor(.white)
                                }
                            }
                            .padding(.horizontal)
                            .onTapGesture {
                                person2LastActivity = Date()
                                person2AlertHandled = false
                            }
                            
                            // PersonCard without title and picker
                            PersonCard(
                                text: $person2Text,
                                selectedLanguage: person2Language,
                                isPlaying: $person2IsPlaying,
                                playAction: { speedMultiplier in
                                    playSpeech(person: 2, action: "play", text: person2Text, language: person2Language, speedMultiplier: speedMultiplier)
                                    addToRecents(person: 2)
                                },
                                pauseAction: {
                                    playSpeech(person: 2, action: "pause", text: person2Text, language: person2Language, speedMultiplier: 1.0)
                                },
                                onTap: {
                                    person2LastActivity = Date()
                                    person2AlertHandled = false
                                },
                                onPlay: {
                                    person2LastActivity = Date()
                                    person2AlertHandled = false
                                }
                            )
                        }
                        .tag(1)
                        .onTapGesture {
                            person2LastActivity = Date()
                            person2AlertHandled = false
                        }
                        .onChange(of: person2Text) { _ in
                            person2LastActivity = Date()
                            person2AlertHandled = false
                            if person2IsPlaying {
                                person2IsPlaying = false
                                speechSynthesizer.stopSpeaking(at: .immediate)
                            }
                        }
                    }
                    .tabViewStyle(PageTabViewStyle())
                    .frame(height: UIScreen.main.bounds.height * 0.5)
                    .onChange(of: selectedTab) { newValue in
                        // Dismiss any active alert
                        activeAlert = nil
                        
                        // Stop any playing speech and reset isPlaying
                        if currentPersonPlaying != nil {
                            speechSynthesizer.stopSpeaking(at: .immediate)
                            if currentPersonPlaying == 1 {
                                person1IsPlaying = false
                            } else if currentPersonPlaying == 2 {
                                person2IsPlaying = false
                            }
                            currentPersonPlaying = nil
                        }
                        
                        // Set alert handled flag to true for previous person
                        if previousTab == 0 {
                            person1AlertHandled = true
                            // Add to recents when tab changes
                            addToRecents(person: 1)
                        } else if previousTab == 1 {
                            person2AlertHandled = true
                            // Add to recents when tab changes
                            addToRecents(person: 2)
                        }
                        
                        // Reset last activity time and alert handled flag for current person
                        if newValue == 0 {
                            person1LastActivity = Date()
                            person1AlertHandled = false
                            if person2IsPlaying {
                                person2IsPlaying = false
                                speechSynthesizer.stopSpeaking(at: .immediate)
                            }
                        } else if newValue == 1 {
                            person2LastActivity = Date()
                            person2AlertHandled = false
                            if person1IsPlaying {
                                person1IsPlaying = false
                                speechSynthesizer.stopSpeaking(at: .immediate)
                            }
                        }
                        
                        // Update previousTab
                        previousTab = newValue
                    }
                }
                
                .navigationTitle("2 Way Conversation")
                .toolbar {
                    ToolbarItem(placement: .navigationBarTrailing) {
                        Button(action: {
                            withAnimation {
                                showInfoView = true
                            }
                        }) {
                            Image(systemName: "info.circle")
                                .foregroundStyle(.gray)
                        }
                    }
                }
            }
            .fullScreenCover(isPresented: $showInfoView) {
                InfoView(showInfoView: $showInfoView)
            }
            .onReceive(timer) { _ in
                let now = Date()
                if selectedTab == 0 {
                    // Person 1's tab
                    if activeAlert == nil && !person1AlertHandled && now.timeIntervalSince(person1LastActivity) > 10 && !person1Text.isEmpty {
                        activeAlert = .person1
                    }
                } else if selectedTab == 1 {
                    // Person 2's tab
                    if activeAlert == nil && !person2AlertHandled && now.timeIntervalSince(person2LastActivity) > 10 && !person2Text.isEmpty {
                        activeAlert = .person2
                    }
                }
            }
            .alert(item: $activeAlert) { alert in
                switch alert {
                case .person1:
                    return Alert(
                        title: Text("Want to move to Person 2 for response?"),
                        primaryButton: .default(Text("Yes"), action: {
                            selectedTab = 1
                            person1AlertHandled = true
                            activeAlert = nil
                        }),
                        secondaryButton: .cancel(Text("No"), action: {
                            person1AlertHandled = true
                            activeAlert = nil
                        })
                    )
                case .person2:
                    return Alert(
                        title: Text("Want to move to Person 1 for response?"),
                        primaryButton: .default(Text("Yes"), action: {
                            selectedTab = 0
                            person2AlertHandled = true
                            activeAlert = nil
                        }),
                        secondaryButton: .cancel(Text("No"), action: {
                            person2AlertHandled = true
                            activeAlert = nil
                        })
                    )
                }
            }
            .navigationDestination(for: RecentsNavigation.self) { recentsNav in
                ConversationRecentsView(
                    recents: recentsNav.person == 1 ? $person1Recents : $person2Recents,
                    selectedLanguage: recentsNav.person == 1 ? person1Language : person2Language,
                    onSelectMessage: { message in
                        if recentsNav.person == 1 {
                            person1Text = message.text
                            person1Language = message.language // Update language
                            person1LastActivity = Date()
                            person1AlertHandled = false
                            if person1IsPlaying {
                                person1IsPlaying = false
                                speechSynthesizer.stopSpeaking(at: .immediate)
                            }
                        } else {
                            person2Text = message.text
                            person2Language = message.language // Update language
                            person2LastActivity = Date()
                            person2AlertHandled = false
                            if person2IsPlaying {
                                person2IsPlaying = false
                                speechSynthesizer.stopSpeaking(at: .immediate)
                            }
                        }
                        // Pop back to the main view
                        navigationPath.removeLast()
                    }
                )
            }
            .onAppear {
                speechSynthesizer.delegate = self
            }
        }
    }
    
    func playSpeech(person: Int, action: String, text: String, language: String, speedMultiplier: Float) {
        if action == "play" {
            if speechSynthesizer.isSpeaking || speechSynthesizer.isPaused {
                speechSynthesizer.stopSpeaking(at: .immediate)
                if let currentPerson = currentPersonPlaying {
                    if currentPerson == 1 {
                        person1IsPlaying = false
                    } else if currentPerson == 2 {
                        person2IsPlaying = false
                    }
                }
            }
            let utterance = AVSpeechUtterance(string: text)
            utterance.voice = AVSpeechSynthesisVoice(language: getLanguageCode(for: language))
            utterance.rate = AVSpeechUtteranceDefaultSpeechRate * speedMultiplier
            speechSynthesizer.speak(utterance)
            currentPersonPlaying = person
            if person == 1 {
                person1IsPlaying = true
            } else if person == 2 {
                person2IsPlaying = true
            }
        } else if action == "pause" {
            if speechSynthesizer.isSpeaking {
                speechSynthesizer.pauseSpeaking(at: .immediate)
            }
            if person == 1 {
                person1IsPlaying = false
            } else if person == 2 {
                person2IsPlaying = false
            }
        }
    }
    
    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
        DispatchQueue.main.async {
            if self.currentPersonPlaying == 1 {
                self.person1IsPlaying = false
            } else if self.currentPersonPlaying == 2 {
                self.person2IsPlaying = false
            }
            self.currentPersonPlaying = nil
        }
    }
    
    func getLanguageCode(for language: String) -> String {
        switch language {
        case "English":
            return "en-US"
        case "Spanish":
            return "es-ES"
        case "French":
            return "fr-FR"
        case "Hindi":
            return "hi-IN"
        case "Chinese":
            return "zh-CN"
        case "Arabic":
            return "ar-SA"
        default:
            return "en-US"
        }
    }
    
    func addToRecents(person: Int) {
        let messageText: String
        let messageLanguage: String
        
        if person == 1 {
            messageText = person1Text
            messageLanguage = person1Language
            if !messageText.isEmpty {
                let newMessage = RecentMessage(text: messageText, language: messageLanguage)
                if !person1Recents.contains(where: { $0.text == messageText && $0.language == messageLanguage }) {
                    person1Recents.insert(newMessage, at: 0)
                }
            }
        } else if person == 2 {
            messageText = person2Text
            messageLanguage = person2Language
            if !messageText.isEmpty {
                let newMessage = RecentMessage(text: messageText, language: messageLanguage)
                if !person2Recents.contains(where: { $0.text == messageText && $0.language == messageLanguage }) {
                    person2Recents.insert(newMessage, at: 0)
                }
            }
        }
    }
}

enum PersonAlert: Identifiable {
    case person1
    case person2
    
    var id: Int {
        switch self {
        case .person1: return 1
        case .person2: return 2
        }
    }
}

struct RecentMessage: Identifiable {
    let id = UUID()
    let text: String
    let language: String
}

struct RecentsNavigation: Hashable {
    let person: Int
}

struct PersonCard: View {
    @Binding var text: String
    let selectedLanguage: String
    @Binding var isPlaying: Bool
    let playAction: (Float) -> Void
    let pauseAction: () -> Void
    let onTap: (() -> Void)?
    let onPlay: (() -> Void)?
    
    var body: some View {
        VStack(alignment: .leading, spacing: 15) {
            // TextEditor with placeholder in selected language
            ZStack(alignment: .topLeading) {
                if text.isEmpty {
                    Text(getPlaceholderText(for: selectedLanguage))
                        .foregroundColor(.gray)
                        .padding(.horizontal, 8)
                        .padding(.vertical, 12)
                        .font(.system(size: 20))
                }
                TextEditor(text: $text)
                    .frame(minHeight: 100)
                    .font(.system(size: 20))
                    .padding(4)
                    .background(Color.clear)
                    .scrollContentBackground(.hidden) // Ensure the background is transparent
            }
            .padding(.horizontal)
            .padding(.vertical, 20)
            .background(Color.red.opacity(0.25))
            .cornerRadius(10)
            .onTapGesture {
                onTap?()
            }
            
            // Play/Pause button at bottom right corner
            HStack {
                Spacer()
                Button(action: {
                    if isPlaying {
                        pauseAction()
                        isPlaying = false
                    } else {
                        playAction(1.0)
                        isPlaying = true
                    }
                    onPlay?()
                }) {
                    Image(systemName: isPlaying ? "pause.circle.fill" : "play.circle.fill")
                        .resizable()
                        .frame(width: 40, height: 40)
                        .foregroundColor(text.isEmpty ? .gray : .white) // Conditional color based on text
                }
                .contextMenu {
                    Button(action: {
                        playAction(0.5) // 0.5x speed
                        isPlaying = true
                        onPlay?()
                    }) {
                        Text("0.5x")
                    }
                    Button(action: {
                        playAction(1.0) // 1x speed
                        isPlaying = true
                        onPlay?()
                    }) {
                        Text("1x")
                    }
                    Button(action: {
                        playAction(1.25) // 1.25x speed
                        isPlaying = true
                        onPlay?()
                    }) {
                        Text("1.25x")
                    }
                }
                .padding()
                .disabled(text.isEmpty) // Disable button when text is empty
            }
        }
        .frame(maxWidth: .infinity, maxHeight: 350)
        .cornerRadius(15)
        .padding()
    }
    
    func getPlaceholderText(for language: String) -> String {
        switch language {
        case "English":
            return "Enter text"
        case "Spanish":
            return "Introducir texto"
        case "French":
            return "Entrez le texte"
        case "Hindi":
            return "पाठ दर्ज करें"
        case "Chinese":
            return "输入文本"
        case "Arabic":
            return "أدخل النص"
        default:
            return "Enter text"
        }
    }
}

#Preview {
    TwoWayConversationView()
}
", I am getting the following errors , "== PREVIEW UPDATE ERROR:

    SchemeBuildError: Failed to build the scheme “QuickAid”
    
    non-class type 'TwoWayConversationView' cannot conform to class protocol 'AVSpeechSynthesizerDelegate'
    
    Build target QuickAid:
    note: Disabling hardened runtime with ad-hoc codesigning. (in target 'QuickAid' from project 'QuickAid')
    
    
    Emit Swift module (arm64):
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'AVSpeechSynthesizerDelegate'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'NSObjectProtocol'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    
    
    Compile TwoWayConversationView.swift (arm64):
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'AVSpeechSynthesizerDelegate'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'NSObjectProtocol'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    



== PREVIEW UPDATE ERROR:

    SchemeBuildError: Failed to build the scheme “QuickAid”
    
    non-class type 'TwoWayConversationView' cannot conform to class protocol 'AVSpeechSynthesizerDelegate'
    
    Build target QuickAid:
    note: Disabling hardened runtime with ad-hoc codesigning. (in target 'QuickAid' from project 'QuickAid')
    
    
    Emit Swift module (arm64):
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'AVSpeechSynthesizerDelegate'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'NSObjectProtocol'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    
    
    Compile TwoWayConversationView.swift (arm64):
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'AVSpeechSynthesizerDelegate'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'NSObjectProtocol'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    



== PREVIEW UPDATE ERROR:

    SchemeBuildError: Failed to build the scheme “QuickAid”
    
    non-class type 'TwoWayConversationView' cannot conform to class protocol 'AVSpeechSynthesizerDelegate'
    
    Build target QuickAid:
    note: Disabling hardened runtime with ad-hoc codesigning. (in target 'QuickAid' from project 'QuickAid')
    
    
    Emit Swift module (arm64):
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'AVSpeechSynthesizerDelegate'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'NSObjectProtocol'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    
    
    Compile TwoWayConversationView.swift (arm64):
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'AVSpeechSynthesizerDelegate'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'NSObjectProtocol'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    



== ERROR:

    SchemeBuildError: Failed to build the scheme “QuickAid”
    
    non-class type 'TwoWayConversationView' cannot conform to class protocol 'AVSpeechSynthesizerDelegate'
    
    Build target QuickAid:
    note: Disabling hardened runtime with ad-hoc codesigning. (in target 'QuickAid' from project 'QuickAid')
    
    
    Emit Swift module (arm64):
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'AVSpeechSynthesizerDelegate'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'NSObjectProtocol'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    
    
    Compile TwoWayConversationView.swift (arm64):
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'AVSpeechSynthesizerDelegate'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    /Users/suryanshmalik/Documents/Disk 1/Coding/Swift/QuickAid.swiftpm/TwoWayConversation/TwoWayConversationView.swift:11:8: error: non-class type 'TwoWayConversationView' cannot conform to class protocol 'NSObjectProtocol'
    struct TwoWayConversationView: View, AVSpeechSynthesizerDelegate {
           ^
    " fix it and give me the whole updated code with the updated changes and the current functionalities intact