import SwiftUI

struct TrendingView: View {
    @State private var selectedSong: UploadedSong?

    @EnvironmentObject private var uploadedSongManager: UploadedSongManager
    @EnvironmentObject private var artistManager: ArtistManager
    @EnvironmentObject private var trendingManager: TrendingSongManager

    @Environment(AudioManager.self) private var audioManager

    var body: some View {
        ScrollView {
            LazyVStack(spacing: 0) {
                // Songs List
                if trendingManager.isLoading && trendingManager.songs.isEmpty {
                    VStack(spacing: 12) {
                        ProgressView()
                            .progressViewStyle(CircularProgressViewStyle(tint: Constants.Colors.Foreground.primary))
                        Text("Loading trending songs...")
                            .font(Constants.Typography.small)
                            .foregroundColor(Constants.Colors.Foreground.tertiary)
                    }
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .padding(.top, 100)
                } else if let errorMessage = trendingManager.errorMessage {
                    VStack(spacing: 12) {
                        Image(systemName: "exclamationmark.triangle")
                            .font(.system(size: 40))
                            .foregroundColor(Constants.Colors.Foreground.tertiary)
                        Text(errorMessage)
                            .font(Constants.Typography.mediumRegular)
                            .foregroundColor(Constants.Colors.Foreground.tertiary)
                            .multilineTextAlignment(.center)
                    }
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .padding(.horizontal, 24)
                    .padding(.top, 100)
                } else if trendingManager.songs.isEmpty {
                    VStack(spacing: 12) {
                        Image(systemName: "chart.line.uptrend.xyaxis")
                            .font(.system(size: 40))
                            .foregroundColor(Constants.Colors.Foreground.tertiary)
                        Text("No trending songs yet")
                            .font(Constants.Typography.mediumRegular)
                            .foregroundColor(Constants.Colors.Foreground.tertiary)
                        Text("Songs liked by their creators will appear here")
                            .font(Constants.Typography.small)
                            .foregroundColor(Constants.Colors.Foreground.tertiary)
                            .multilineTextAlignment(.center)
                    }
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .padding(.horizontal, 24)
                    .padding(.top, 100)
                } else {
                    ForEach(trendingManager.songs) { song in
                        if let rootRemixSongId = song.rootRemixSongId,
                              let rootRemixSong = uploadedSongManager.songForID(rootRemixSongId),
                              let originalArtist = artistManager.artistForID(rootRemixSong.artistId) {
                            LibrarySongRow(song: song, playlist: trendingManager.songs, showRemixIcon: false, showOriginalArtist: originalArtist) { song in
                                selectedSong = song
                            }
                        }
                    }
                }
            }
        }
        .background(Constants.Colors.Background.primary)
        .navigationTitle("Trending")
        .navigationBarTitleDisplayMode(.inline)
        .preferredColorScheme(.dark)
        .onAppear {
            trendingManager.fetchTrendingSongs()
        }
        .sheet(item: $selectedSong) { item in
            RemixSelectionView(song: item)
            .presentationDetents([.medium])
            .presentationDragIndicator(.hidden)
            .presentationBackground(.ultraThinMaterial)
        }
    }
}

#Preview {
    NavigationStack {
        TrendingView()
    }
}
