import SwiftUI

struct ClipRowView: View {
    let clip: SourceClip
    let availability: ClipAvailability
    var onLocate: () -> Void
    var onPlay: () -> Void

    var body: some View {
        HStack(spacing: 12) {
            thumbnail
            VStack(alignment: .leading, spacing: 4) {
                Text(clip.displayName)
                    .font(.headline)
                    .lineLimit(1)
                Text(detailText)
                    .font(.caption)
                    .foregroundStyle(.secondary)
                statusBadge
            }
            Spacer()
            trailingAction
        }
    }

    private var thumbnail: some View {
        ZStack {
            RoundedRectangle(cornerRadius: 8)
                .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: 64, height: 64)
        .clipShape(RoundedRectangle(cornerRadius: 8))
    }

    private var detailText: String {
        let fingerprint = clip.fingerprint
        let duration = Duration.seconds(fingerprint.duration).formatted(.time(pattern: .minuteSecond))
        let source = clip.ref.kind == .photos ? "Photos" : "File"
        return "\(duration) · \(fingerprint.pixelWidth)×\(fingerprint.pixelHeight) · \(source)"
    }

    @ViewBuilder
    private var statusBadge: some View {
        switch availability {
        case .available:
            Label("Available", systemImage: "checkmark.circle.fill")
                .font(.caption2)
                .foregroundStyle(.green)
        case .missing(let reason):
            Label(reason, systemImage: "exclamationmark.triangle.fill")
                .font(.caption2)
                .foregroundStyle(.orange)
        case .unknown:
            Text("Checking…")
                .font(.caption2)
                .foregroundStyle(.secondary)
        }
    }

    @ViewBuilder
    private var trailingAction: some View {
        switch availability {
        case .available:
            Button(action: onPlay) {
                Image(systemName: "play.circle")
                    .font(.title2)
            }
            .buttonStyle(.borderless)
        case .missing:
            Button("Locate…", action: onLocate)
                .buttonStyle(.borderedProminent)
                .controlSize(.small)
        case .unknown:
            ProgressView()
        }
    }
}
