//
//  FeedView.swift
//  Suno
//
//  Created by Martin Camacho on 1/7/24.
//

import Foundation
import SwiftUI
import AVFoundation
import ClerkSDK


struct Clip: Identifiable, Decodable {
    var id: UUID
    var audioUrl: String?
    var title: String?
    var imageUrl: String?
    
    let metadata: ClipMetadata
}

struct ClipMetadata: Codable {
    let tags: String?
    let prompt: String?
}

struct GenerateRequestBody: Codable {
    var gptDescriptionPrompt: String
    var mv: String
    var prompt: String
}

class FeedViewModel: ObservableObject {
    @Published var items = [Clip]()
    

    var clipsCallback: () async throws -> [Clip]
    private var timer: Timer?
    
    private var networkManager: NetworkManager = NetworkManager()
    
    init(clipsCallback: @escaping () async throws  -> [Clip]) {
        self.clipsCallback = clipsCallback
    }

    
    func load() {
        Task { [weak self] in
            do {
                let items = try await clipsCallback()
                DispatchQueue.main.async {
                    print("Loading items", items.count)
                    self?.items = items
                }
            } catch {
                // Handle any errors, such as logging them or showing an error message
                print("Error fetching data: \(error.localizedDescription)")
            }
        }
    }
    
    func onAppear() {
        self.load()
        timer = Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { [weak self] _ in
            self?.load()
        }
    }
    
    func onDisappear() {
        timer?.invalidate()
        timer = nil
    }
    
    deinit {
        // Invalidate the timer if the view model is deinitialized
        onDisappear()
    }
}



struct FeedView: View {
    
    
    @StateObject var viewModel = FeedViewModel(
        clipsCallback: NetworkManager().fetchData2
    )
    @ObservedObject var playerViewModel: PlayerViewModel
    
    @State private var currentClipID: UUID?
    @EnvironmentObject private var clerk: Clerk
    
    var body: some View {
        if clerk.session == nil {
            UserButton()
        } else {
            VStack {
                List(viewModel.items) { item in
                    SongRowView(item: item, isSelected:  playerViewModel.currentClip?.id == item.id)
                        .onTapGesture {
                            playerViewModel.playClip(clip: item)
                        }
      
                    //                .listRowBackground(Color.black)
                }
                .listRowInsets(EdgeInsets()) // Remove default list row padding
                .listRowBackground(Color.clear) // Make list row background clear
                .navigationBarTitle("Items")
                .background(Color.black)
            }
            .onAppear {
                viewModel.onAppear()
            }
        }

    }
}

struct ExploreView: View {
    
    
    @StateObject var viewModel = FeedViewModel(
        clipsCallback: NetworkManager().fetchTrending
    )
    @ObservedObject var playerViewModel: PlayerViewModel
    
    @State private var currentClipID: UUID?
    @EnvironmentObject private var clerk: Clerk
    
    var body: some View {
        if clerk.session == nil {
            UserButton()
        } else {
            VStack {
                List(viewModel.items) { item in
                    SongRowView(item: item, isSelected:  playerViewModel.currentClip?.id == item.id)
                        .onTapGesture {
                            playerViewModel.playClip(clip: item)
                        }
                    
                    //                .listRowBackground(Color.black)
                }
                .listRowInsets(EdgeInsets()) // Remove default list row padding
                .listRowBackground(Color.clear) // Make list row background clear
                .navigationBarTitle("Items")
                .background(Color.black)
            }
            .onAppear {
                viewModel.onAppear()
            }
        }
        
    }
}


struct FeedView_Previews: PreviewProvider {
    static var previews: some View {
        // Create a preview instance of PlayerViewModel
        let previewPlayerViewModel = PlayerViewModel()
        
        // Optionally, configure the previewPlayerViewModel with mock data
        
        var networkManager = NetworkManager()
        
        // Pass the previewPlayerViewModel to FeedView
        FeedView(playerViewModel: previewPlayerViewModel)
            .environmentObject(networkManager)
    }
}
