import XCTest
@testable import PoseCore

final class PairAnalysisRevisionTests: XCTestCase {
    func testReportTracksCommitUndoContextAndCatalogWithoutMutatingInput() throws {
        var doc = try reviewedPair()
        let pair = try XCTUnwrap(PairReview.resolve(doc.frames).first)
        let initial = try PairAnalysis.analyze(doc, pair: pair)
        XCTAssertEqual(initial, try PairAnalysis.analyze(doc, pair: pair))
        let prior = doc.frames[0].edits["left_elbow"]
        try doc.frames[0].setJoint("left_elbow", point: Point2(x: 210, y: 220), state: .corrected)
        doc.revision += 1
        let edited = try PairAnalysis.analyze(doc, pair: pair)
        XCTAssertEqual(edited.revision, 1); XCTAssertNotEqual(edited.observations, initial.observations)
        doc.frames[0].restore("left_elbow", to: prior); doc.revision += 1
        XCTAssertEqual(try PairAnalysis.analyze(doc, pair: pair).observations, initial.observations)
        doc.comparisonContexts[0].comparability[.leftElbow] = .notComparable; doc.revision += 1
        XCTAssertNil(try PairAnalysis.analyze(doc, pair: pair).observations[0].delta)
        let revised = try PairAnalysis.analyze(doc, pair: pair, catalog: RuleCatalog(version: "new", rules: []))
        XCTAssertEqual(revised.catalogVersion, "new"); XCTAssertEqual(doc.revision, 3)
    }
    func testCallbackTargetsAreBoundToSessionCanvasAndFrame() throws {
        let doc = pairDocument(), session = UUID(), canvas = UUID()
        let target = ReviewEditTarget(session: session, canvas: canvas, frameID: "P01-reference", joint: "left_elbow")
        XCTAssertEqual(target.index(in: doc, session: session, canvas: canvas, visibleIDs: ["P01-subject", "P01-reference"]), 0)
        XCTAssertNil(target.index(in: doc, session: UUID(), canvas: canvas, visibleIDs: ["P01-reference"]))
        XCTAssertNil(target.index(in: doc, session: session, canvas: UUID(), visibleIDs: ["P01-reference"]))
        XCTAssertNil(target.index(in: doc, session: session, canvas: canvas, visibleIDs: ["P01-subject"]))
    }
}
