import SwiftUI

/// Multi-select picker over the source library for adding clips to a draft.
struct SourceClipPickerView: View {
    @EnvironmentObject private var library: SourceLibrary
    @Environment(\.dismiss) private var dismiss
    var onAdd: ([SourceClip]) -> Void

    @State private var selection: Set<UUID> = []

    var body: some View {
        NavigationStack {
            List {
                if library.clips.isEmpty {
                    ContentUnavailableView(
                        "Library is empty",
                        systemImage: "film",
                        description: Text("Import clips in the Library tab first.")
                    )
                } else {
                    ForEach(library.clips) { clip in
                        Button {
                            if selection.contains(clip.id) {
                                selection.remove(clip.id)
                            } else {
                                selection.insert(clip.id)
                            }
                        } label: {
                            row(clip)
                        }
                        .buttonStyle(.plain)
                    }
                }
            }
            .navigationTitle("Add Clips")
            .navigationBarTitleDisplayMode(.inline)
            .toolbar {
                ToolbarItem(placement: .topBarLeading) {
                    Button("Cancel") { dismiss() }
                }
                ToolbarItem(placement: .topBarTrailing) {
                    Button("Add (\(selection.count))") {
                        let selected = library.clips.filter { selection.contains($0.id) }
                        onAdd(selected)
                        dismiss()
                    }
                    .disabled(selection.isEmpty)
                }
            }
        }
    }

    private func row(_ clip: SourceClip) -> some View {
        HStack(spacing: 12) {
            Image(systemName: selection.contains(clip.id) ? "checkmark.circle.fill" : "circle")
                .foregroundStyle(selection.contains(clip.id) ? Color.accentColor : Color.secondary)
                .font(.title3)
            ZStack {
                RoundedRectangle(cornerRadius: 6)
                    .fill(.quaternary)
                if let image = ThumbnailService.load(for: clip.id) {
                    Image(uiImage: image)
                        .resizable()
                        .aspectRatio(contentMode: .fill)
                } else {
                    Image(systemName: "film")
                        .foregroundStyle(.secondary)
                }
            }
            .frame(width: 48, height: 48)
            .clipShape(RoundedRectangle(cornerRadius: 6))
            VStack(alignment: .leading, spacing: 2) {
                Text(clip.displayName)
                    .font(.subheadline)
                    .lineLimit(1)
                Text(timeString(clip.fingerprint.duration))
                    .font(.caption)
                    .foregroundStyle(.secondary)
            }
            Spacer()
            if case .missing = library.availability[clip.id] ?? .unknown {
                Image(systemName: "exclamationmark.triangle.fill")
                    .foregroundStyle(.orange)
                    .font(.caption)
            }
        }
    }
}
