import XCTest
@testable import PoseCore

final class RetryTests: XCTestCase {
    func testRetryPreservesCorrectionsOcclusionsAndOriginalEvidence() throws {
        let pose = PoseResult(kind: "2D", status: "needsReview", requestRevision: 1, durationSeconds: 0,
            joints: [JointResult(name: "left_elbow", point: Point2(x: 20, y: 20)), JointResult(name: "left_knee", point: Point2(x: 30, y: 30))], candidateCount: 1)
        var frame = ReviewFrame(id: "a", pairID: "a", role: "subject", rider: "Test", file: "a", sourceHash: "h", panel: PixelRect(x: 0, y: 0, width: 100, height: 100), raw3D: nil, raw2D: nil)
        try frame.setJoint("left_elbow", point: Point2(x: 50, y: 50), state: .corrected)
        try frame.setJoint("left_knee", point: nil, state: .occluded)
        frame.addRetry(DetectionRetry(crop: frame.panel, twoD: pose, threeD: nil))
        XCTAssertEqual(frame.displayPoint("left_elbow", kind: "2D"), Point2(x: 50, y: 50))
        XCTAssertNil(frame.displayPoint("left_knee", kind: "2D"))
        XCTAssertNil(frame.raw2D)
        frame.restore("left_elbow", to: nil)
        XCTAssertEqual(frame.displayPoint("left_elbow", kind: "2D"), Point2(x: 20, y: 20))
        frame.addRetry(DetectionRetry(crop: frame.panel, twoD: nil, threeD: nil))
        XCTAssertEqual(frame.displayPoint("left_elbow", kind: "2D"), Point2(x: 20, y: 20))
        let data = try JSONEncoder().encode(frame)
        var legacy = try JSONSerialization.jsonObject(with: data) as! [String: Any]
        legacy.removeValue(forKey: "retries")
        let old = try JSONDecoder().decode(ReviewFrame.self, from: JSONSerialization.data(withJSONObject: legacy))
        XCTAssertNil(old.retries)
        XCTAssertEqual(old.edits, frame.edits)
        XCTAssertEqual(try JSONDecoder().decode(ReviewFrame.self, from: data).retries?.count, 2)
    }
}
