import XCTest
@testable import PoseCore

final class FeedbackRulesTests: XCTestCase {
    func testSupportedRulesThresholdPriorityDedupAndCap() throws {
        var doc = try reviewedPair()
        for feature in PairFeature.allCases {
            try doc.frames[1].setJoint(feature.joints[2], point: Point2(x: 300, y: 200), state: .corrected)
        }
        let pair = try XCTUnwrap(PairReview.resolve(doc.frames).first)
        func rule(_ id: String, _ f: PairFeature, priority: Int = 1, threshold: Double? = 90, review: String? = "Synthetic test only") -> FeedbackRule {
            FeedbackRule(id: id, version: "test", feature: f, direction: .greater, threshold: threshold, priority: priority,
                         suggestion: "Discuss whether this visible difference matters for this view.", limitation: "2D only.", reviewProvenance: review, requiresCorner: false)
        }
        let rules = [rule("z", .leftElbow), rule("a", .leftElbow), rule("b", .rightElbow), rule("c", .leftKnee), rule("d", .rightKnee), rule("missing", .rightKnee, priority: 0, review: nil)]
        let report = try PairAnalysis.analyze(doc, pair: pair, catalog: RuleCatalog(version: "synthetic", rules: rules))
        XCTAssertEqual(report.focus.map(\.ruleID), ["a", "b", "c"])
        XCTAssertEqual(report.focus.first?.joints, PairFeature.leftElbow.joints)
        XCTAssertTrue(try PairAnalysis.analyze(doc, pair: pair).focus.isEmpty)
        for invalid in [rule("x", .leftElbow, threshold: nil), rule("x", .leftElbow, threshold: 91), rule("x", .leftElbow, review: nil)] {
            XCTAssertTrue(try PairAnalysis.analyze(doc, pair: pair, catalog: RuleCatalog(version: "test", rules: [invalid])).focus.isEmpty)
        }
        var directional = rule("turn", .leftElbow); directional.requiresCorner = true
        XCTAssertTrue(try PairAnalysis.analyze(doc, pair: pair, catalog: RuleCatalog(version: "test", rules: [directional])).focus.isEmpty)
        doc.comparisonContexts[0].cornerDirection = .left
        XCTAssertEqual(try PairAnalysis.analyze(doc, pair: pair, catalog: RuleCatalog(version: "test", rules: [directional])).focus.count, 1)
    }
}
