import XCTest
import RideFormCore
@testable import RideForm

final class SessionReviewExportTests: XCTestCase {
    func testSavedFixtureFilteringExportMatchesVisibleConfigurationAndPreservesMaster() async throws {
        #if targetEnvironment(simulator)
        let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
        let url: URL = try await withCheckedThrowingContinuation { continuation in
            do { try ReviewUIFixture.create(in:root) { continuation.resume(with:$0) } }
            catch { continuation.resume(throwing:error) }
        }
        let session = try SessionIO.load(url)
        let before = try DerivedSidecar<AnalysisResult>.identity(session)
        var config = MotionAnalyzer.defaultConfiguration; config.filterMethod = "localPolynomial"; config.derivativeWindowSeconds = 0.2
        let visible = try MotionAnalyzer.analyze(session:session,configuration:config)
        XCTAssertEqual(visible.rawTrace.count,601)
        XCTAssertTrue(visible.qualityFlags.contains("sampling_gap"))
        XCTAssertFalse(visible.transitions.isEmpty)
        let files = try ShareExporter(temporaryDirectory:root).prepare(bundle:url,analysisConfiguration:visible.configuration)
        let analysisURL = try XCTUnwrap(files.first { $0.lastPathComponent == "analysis.json" })
        let exported = try JSONDecoder().decode(DerivedSidecar<AnalysisResult>.self,from:Data(contentsOf:analysisURL))
        XCTAssertEqual(exported.payload,visible)
        let configURL = try XCTUnwrap(files.first { $0.lastPathComponent == "analysis-configuration.json" })
        XCTAssertEqual(try JSONDecoder().decode(AnalysisConfiguration.self,from:Data(contentsOf:configURL)),visible.configuration)
        XCTAssertEqual(try DerivedSidecar<AnalysisResult>.identity(SessionIO.load(url)),before)
        XCTAssertFalse(files.contains { $0.path.hasPrefix(url.path+"/") })
        #endif
    }
}
