import SwiftUI
import SwiftData
import UniformTypeIdentifiers

struct ImportView: View {
    @Environment(\.modelContext) private var modelContext
    @EnvironmentObject private var lanServer: LanImportServer

    @State private var showFileImporter = false
    @State private var localImportMessage: String?
    @State private var portText = "8787"

    private var store: LibraryStore {
        LibraryStore(modelContext: modelContext)
    }

    var body: some View {
        ScrollView {
            VStack(alignment: .leading, spacing: 24) {
                header
                lanCard
                secondaryImport
                summary
            }
            .padding(24)
            .frame(maxWidth: 820, alignment: .leading)
        }
        .navigationTitle("Import")
        .onAppear {
            lanServer.attach(store: store)
            portText = String(lanServer.port)
        }
        .fileImporter(
            isPresented: $showFileImporter,
            allowedContentTypes: Self.allowedTypes,
            allowsMultipleSelection: true
        ) { result in
            handleFileImport(result)
        }
    }

    private var header: some View {
        VStack(alignment: .leading, spacing: 8) {
            Text("局域网导入")
                .font(.largeTitle.bold())
            Text("在同网电脑浏览器打开下方地址，上传文件到 iPad（扁平落盘，再到 Explorer 整理）。无密码鉴权，仅用于可信局域网，勿对公网开放。")
                .foregroundStyle(.secondary)
        }
    }

    private var lanCard: some View {
        VStack(alignment: .leading, spacing: 16) {
            HStack {
                Text("局域网服务")
                    .font(.title2.bold())
                Spacer()
                Toggle(lanServer.isRunning ? "运行中" : "已停止", isOn: Binding(
                    get: { lanServer.isRunning },
                    set: { on in
                        if on {
                            let port = UInt16(portText) ?? 8787
                            lanServer.start(preferredPort: port)
                        } else {
                            lanServer.stop()
                        }
                    }
                ))
                .labelsHidden()
            }

            if lanServer.stoppedByBackground {
                Text(lanServer.lastStatusMessage)
                    .foregroundStyle(.orange)
            } else {
                Text(lanServer.lastStatusMessage)
                    .foregroundStyle(.secondary)
            }

            HStack(spacing: 12) {
                Text("端口")
                TextField("8787", text: $portText)
                    .keyboardType(.numberPad)
                    .textFieldStyle(.roundedBorder)
                    .frame(width: 100)
                    .disabled(lanServer.isRunning)
            }

            if lanServer.isRunning {
                VStack(alignment: .leading, spacing: 12) {
                    labeled("地址", lanServer.displayURL)
                    Text("仅信任网络使用 · 上传无需密码")
                        .font(.caption)
                        .foregroundStyle(.secondary)
                    HStack(spacing: 12) {
                        Button("复制地址") {
                            UIPasteboard.general.string = lanServer.displayURL
                        }
                    }
                    .buttonStyle(.bordered)

                    if let url = lanServer.baseURL?.absoluteString {
                        QRCodeImage(content: url)
                            .padding(.top, 4)
                    }
                }
                .padding()
                .background(RoundedRectangle(cornerRadius: 16).fill(Color(.secondarySystemBackground)))
            }
        }
    }

    private var secondaryImport: some View {
        VStack(alignment: .leading, spacing: 12) {
            Text("次要导入")
                .font(.title2.bold())
            Text("也可从「文件」App 选择媒体，写入同一 library。")
                .foregroundStyle(.secondary)
            Button {
                showFileImporter = true
            } label: {
                Label("从文件 App 选取", systemImage: "folder.badge.plus")
            }
            .buttonStyle(.borderedProminent)
            if let localImportMessage {
                Text(localImportMessage)
                    .foregroundStyle(.secondary)
            }
        }
    }

    private var summary: some View {
        VStack(alignment: .leading, spacing: 8) {
            Text("最近导入")
                .font(.title3.bold())
            Text(lanServer.importSummary.descriptionText)
                .foregroundStyle(.secondary)
        }
    }

    private func labeled(_ title: String, _ value: String) -> some View {
        VStack(alignment: .leading, spacing: 4) {
            Text(title)
                .font(.caption)
                .foregroundStyle(.secondary)
            Text(value)
                .font(.body.monospaced())
                .textSelection(.enabled)
        }
    }

    private func handleFileImport(_ result: Result<[URL], Error>) {
        switch result {
        case .failure(let error):
            localImportMessage = error.localizedDescription
        case .success(let urls):
            var imported = 0
            var skipped = 0
            var failed = 0
            for url in urls {
                let kind = ResourceKind.from(url: url)
                if kind == .other {
                    skipped += 1
                    continue
                }
                do {
                    _ = try store.importFile(from: url, targetDir: "")
                    imported += 1
                } catch {
                    failed += 1
                    localImportMessage = error.localizedDescription
                }
            }
            lanServer.recordImport(imported: imported, skippedOther: skipped, failed: failed)
            localImportMessage = "文件导入：成功 \(imported)，跳过 \(skipped)，失败 \(failed)"
        }
    }

    private static var allowedTypes: [UTType] {
        [.movie, .audio, .pdf, .mpeg4Movie, .mpeg4Audio, .mp3, .wav]
    }
}
