import Foundation
import UIKit
import RideFormCore

final class ShareExporter {
    let temporaryDirectory: URL
    init(temporaryDirectory: URL = FileManager.default.temporaryDirectory) { self.temporaryDirectory = temporaryDirectory }
    /// Run off the UI thread; temporary artifacts stay separate from immutable masters.
    func prepare(bundle: URL, analysisConfiguration: AnalysisConfiguration? = nil) throws -> [URL] {
        let session = try SessionIO.load(bundle)
        let root = temporaryDirectory.appendingPathComponent("RideForm-export-" + UUID().uuidString, isDirectory: true)
        try FileManager.default.createDirectory(at: root, withIntermediateDirectories: true)
        let master = root.appendingPathComponent(session.manifest.id.uuidString + ".zip")
        try MasterArchive.write(bundle: bundle, to: master)
        let csv = try CSVExport.write(session, to: root.appendingPathComponent("CSV", isDirectory: true))
        var derived: [URL] = []
        if let analysisConfiguration {
            let sidecar = root.appendingPathComponent("analysis.json")
            let result = try MotionAnalyzer.analyzeAndSave(session: session, configuration: analysisConfiguration, masterURL: bundle, sidecarURL: sidecar)
            let configuration = root.appendingPathComponent("analysis-configuration.json")
            try SessionCodec.encode(result.configuration).write(to: configuration, options: .atomic)
            derived += [sidecar, configuration]
        }
        if session.events.contains(where: { $0.kind == "diagnosticPhase" }) {
            let diagnostic = root.appendingPathComponent("diagnostics.json")
            try SessionCodec.encode(SensorDiagnostics.analyze(session: session)).write(to: diagnostic, options: .atomic)
            derived.append(diagnostic)
        }
        return [master] + csv + derived
    }
    @MainActor
    func shareSheet(files: [URL]) -> UIActivityViewController {
        UIActivityViewController(activityItems: files, applicationActivities: nil)
    }
}
