import AVKit
import PDFKit
import SwiftUI

struct StudyBottomChromeView: View {
    @ObservedObject var chat: StudyChatController
    let player: AVPlayer?
    var onCapture: () -> Void

    @State private var currentTime: Double = 0
    @State private var duration: Double = 0
    @State private var isPlaying = false
    @State private var timeObserver: Any?

    var body: some View {
        MediaWaveformView(
            currentTime: currentTime,
            duration: duration,
            isPlaying: isPlaying,
            clipRange: chat.attachmentAudio,
            onSeek: seek(to:),
            onTogglePlay: togglePlay
        )
        .onAppear { bindPlayer() }
        .onDisappear { unbindPlayer() }
        .onChange(of: player) { _, _ in
            unbindPlayer()
            bindPlayer()
        }
    }

    private func bindPlayer() {
        guard let player else { return }
        if let item = player.currentItem {
            duration = item.duration.seconds.isFinite ? item.duration.seconds : 0
        }
        currentTime = player.currentTime().seconds.isFinite ? player.currentTime().seconds : 0
        isPlaying = player.rate > 0
        timeObserver = player.addPeriodicTimeObserver(
            forInterval: CMTime(seconds: 0.25, preferredTimescale: 600),
            queue: .main
        ) { time in
            currentTime = time.seconds.isFinite ? time.seconds : 0
            if let d = player.currentItem?.duration.seconds, d.isFinite {
                duration = d
            }
            isPlaying = player.rate > 0
        }
    }

    private func unbindPlayer() {
        if let timeObserver, let player {
            player.removeTimeObserver(timeObserver)
        }
        timeObserver = nil
    }

    private func togglePlay() {
        guard let player else { return }
        if player.rate > 0 {
            player.pause()
        } else {
            player.play()
        }
        isPlaying = player.rate > 0
    }

    private func seek(to time: Double) {
        guard let player else { return }
        player.seek(to: CMTime(seconds: time, preferredTimescale: 600))
        currentTime = time
    }
}

struct StudyPdfPanelView: View {
    let document: PDFDocument
    @Binding var pageIndex: Int

    var body: some View {
        VStack(spacing: 0) {
            HStack {
                Text("PDF")
                    .font(.caption.weight(.semibold))
                    .foregroundStyle(.secondary)
                Spacer()
                Text("第 \(pageIndex) 页")
                    .font(.caption)
                    .foregroundStyle(.secondary)
            }
            .padding(.horizontal, 12)
            .padding(.vertical, 8)
            PDFKitView(document: document, pageIndex: $pageIndex)
        }
    }
}
