import SwiftUI
import PDFKit
import AVFoundation

struct AiAssistSheet: View {
    enum Mode { case pdf, video, audio }

    let mode: Mode
    let pdfDocument: PDFDocument?
    let pdfPage: Int
    let player: AVPlayer?

    @Environment(\.dismiss) private var dismiss
    @State private var question = ""
    @State private var answer: String?
    @State private var error: String?
    @State private var busy = false
    @State private var clipStart: Double?
    @State private var clipEnd: Double?
    @State private var regionImage: UIImage?

    var body: some View {
        NavigationStack {
            Form {
                if mode != .pdf {
                    Section("时间片段") {
                        Button("标记开始 \(fmt(clipStart))") { mark(start: true) }
                        Button("标记结束 \(fmt(clipEnd))") { mark(start: false) }
                    }
                }
                if mode == .pdf || pdfDocument != nil {
                    Section("PDF 区域") {
                        if let regionImage {
                            Image(uiImage: regionImage)
                                .resizable()
                                .scaledToFit()
                                .frame(maxHeight: 160)
                        }
                        Button(regionImage == nil ? "截取当前页" : "重新截取当前页") {
                            regionImage = renderCurrentPdfPage()
                        }
                    }
                }
                Section("提问") {
                    TextField("问题", text: $question, axis: .vertical)
                        .lineLimit(3...6)
                    Button("向 AI 提问") {
                        Task { await ask() }
                    }
                    .disabled(busy || question.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty)
                }
                if let error {
                    Section { Text(error).foregroundStyle(.red) }
                }
                if let answer {
                    Section("回答") {
                        Text(answer)
                    }
                }
            }
            .navigationTitle("AI 助手")
            .toolbar {
                ToolbarItem(placement: .cancellationAction) {
                    Button("关闭") { dismiss() }
                }
            }
            .overlay {
                if busy {
                    ProgressView("思考中…")
                        .padding()
                        .background(.ultraThinMaterial, in: RoundedRectangle(cornerRadius: 12))
                }
            }
        }
    }

    private func fmt(_ t: Double?) -> String {
        guard let t else { return "" }
        return String(format: "%.1fs", t)
    }

    private func mark(start: Bool) {
        let t = player?.currentTime().seconds ?? 0
        if start { clipStart = t } else { clipEnd = t }
    }

    private func renderCurrentPdfPage() -> UIImage? {
        guard let doc = pdfDocument else { return nil }
        let idx = max(0, min(pdfPage - 1, doc.pageCount - 1))
        guard let page = doc.page(at: idx) else { return nil }
        let bounds = page.bounds(for: .mediaBox)
        let scale: CGFloat = 2
        let size = CGSize(width: bounds.width * scale, height: bounds.height * scale)
        let renderer = UIGraphicsImageRenderer(size: size)
        return renderer.image { ctx in
            UIColor.white.setFill()
            ctx.fill(CGRect(origin: .zero, size: size))
            ctx.cgContext.translateBy(x: 0, y: size.height)
            ctx.cgContext.scaleBy(x: scale, y: -scale)
            page.draw(with: .mediaBox, to: ctx.cgContext)
        }
    }

    @MainActor
    private func ask() async {
        busy = true
        error = nil
        answer = nil
        defer { busy = false }
        do {
            let cfg = try await AiConfigClient.resolveConfig { c in
                switch mode {
                case .pdf: return c.features.pdfChat
                case .video: return c.features.videoRegionAsk
                case .audio: return c.features.audioClipAsk
                }
            }
            let system: String
            switch mode {
            case .pdf: system = cfg.prompts.pdfAsk.isEmpty ? cfg.prompts.imageRegion : cfg.prompts.pdfAsk
            case .video: system = cfg.prompts.videoAsk
            case .audio: system = cfg.prompts.audioAsk
            }
            var user = question.trimmingCharacters(in: .whitespacesAndNewlines)
            if mode != .pdf {
                let a = min(clipStart ?? 0, clipEnd ?? player?.currentTime().seconds ?? 0)
                let b = max(clipStart ?? 0, clipEnd ?? player?.currentTime().seconds ?? 0)
                user += String(format: "\n\n时间范围: %.2fs – %.2fs", a, b)
            }
            var b64: String?
            if let img = regionImage, let data = img.jpegData(compressionQuality: 0.85) {
                b64 = data.base64EncodedString()
                user += "\n\n(已附带 PDF 页面/区域截图)"
            }
            answer = try await AiChatClient.complete(
                config: cfg,
                system: system,
                user: user,
                imageJPEGBase64: b64,
                capability: mode == .pdf ? "vision" : "chat"
            )
        } catch {
            self.error = error.localizedDescription
        }
    }
}
