import XCTest
@testable import PoseCore

final class PhotoCoachingTests: XCTestCase {
    func testPhotoCoachingWithoutIdentityChecklistAndSourceBoundImport() throws {
        let doc = pairDocument()
        let pair = try XCTUnwrap(PairReview.resolve(doc.frames).first)
        var context = try PairContext(document: doc, pair: pair)
        context.photoCoaching = PhotoCoachingReview(cornerDirection: .left, provenance: "Synthetic visual review",
            points: [PhotoCoachingPoint(title: "Lower the torso", detail: "Synthetic comparison only")])
        let imported = try PhotoCoachingImport.apply([context], to: doc)
        let report = try PairAnalysis.analyze(imported, pair: pair)
        XCTAssertFalse(report.context.subjectConfirmed)
        XCTAssertEqual(report.effectiveCornerDirection, .left)
        XCTAssertEqual(report.coaching.map(\.title), ["Lower the torso"])
        let encoder = JSONEncoder(); encoder.outputFormatting = [.sortedKeys]
        XCTAssertEqual(try encoder.encode(imported.frames), try encoder.encode(doc.frames))
        XCTAssertEqual(imported.revision, doc.revision + 1)
        let decoded = try JSONDecoder().decode(ReviewDocument.self, from: JSONEncoder().encode(imported))
        XCTAssertEqual(decoded.comparisonContexts, imported.comparisonContexts)
        XCTAssertThrowsError(try PhotoCoachingImport.apply([context, context], to: doc))
        let foreign = ReviewDocument(manifestHash: doc.manifestHash, reportHash: "different", frames: doc.frames)
        XCTAssertThrowsError(try PhotoCoachingImport.apply([context], to: foreign))
    }

    func testDirectionOverrideWithholdsContradictoryNotes() throws {
        var doc = pairDocument()
        let pair = try XCTUnwrap(PairReview.resolve(doc.frames).first)
        var context = try PairContext(document: doc, pair: pair)
        context.cornerDirection = .right
        context.photoCoaching = PhotoCoachingReview(cornerDirection: .left, provenance: "Synthetic review",
            points: [PhotoCoachingPoint(title: "Inside cue", detail: "For the reviewed left turn")])
        doc.comparisonContexts = [context]
        let report = try PairAnalysis.analyze(doc, pair: pair)
        XCTAssertEqual(report.effectiveCornerDirection, .right)
        XCTAssertTrue(report.coaching.isEmpty)
    }
}
