import SwiftUI

struct QueueView: View {
    @State private var expanded = false

    @ObservedObject private var player = PlayerModel.shared

    var body: some View {
        LazyVStack {
            if !items.isEmpty {
                Button {
                    withAnimation {
                        expanded.toggle()
                    }
                } label: {
                    HStack(spacing: 12) {
                        sectionLabel(label)
                        Spacer()
                        ClearQueueButton()
                        if items.count > 1 {
                            Label("Show more", systemImage: expanded ? "chevron.up" : "chevron.down")
                                .animation(nil, value: expanded)
                                .foregroundColor(.accentColor)
                                .imageScale(.large)
                                .labelStyle(.iconOnly)
                        }
                    }
                }
                .buttonStyle(.plain)

                LazyVStack(alignment: .leading) {
                    ForEach(limitedItems) { item in
                        ContentItemView(item: .init(video: item.video))
                            .environment(\.listingStyle, .list)
                            .environment(\.inQueueListing, true)
                            .environment(\.noListingDividers, limit == 1)
                            .transition(.opacity)
                    }
                }
            }
        }
        .padding(.vertical, items.isEmpty ? 0 : 15)
    }

    var label: String {
        if items.count < 2 {
            return "Next in Queue"
        }

        return "Next in Queue (\(items.count))"
    }

    var limitedItems: [ContentItem] {
        if let limit {
            return Array(items.prefix(limit).map(\.contentItem))
        }

        return items.map(\.contentItem)
    }

    var items: [PlayerQueueItem] {
        player.queue
    }

    var limit: Int? {
        if !expanded {
            return 1
        }

        return nil
    }

    func sectionLabel(_ label: String) -> some View {
        Text(label.localized())
            .font(.title3.bold())
            .frame(maxWidth: .infinity, alignment: .leading)
            .foregroundColor(.secondary)
    }
}

struct QueueView_Previews: PreviewProvider {
    static var previews: some View {
        QueueView()
    }
}