import XCTest
@testable import PoseCore

final class SeparateSourceTests: XCTestCase {
    func testSeparateSourceAndLegacyFallback() throws {
        let data = Data(#"{"schemaVersion":1,"session":"test","annotationProvenance":"synthetic","pairs":[{"id":"P01","file":"subject.png","riders":[{"role":"subject","rider":"A","panel":{"x":0,"y":0,"width":10,"height":10},"crop":{"x":0,"y":0,"width":10,"height":10},"annotations":[],"annotationNote":"synthetic"},{"role":"reference","rider":"B","file":"reference.png","panel":{"x":0,"y":0,"width":10,"height":10},"crop":{"x":0,"y":0,"width":10,"height":10},"annotations":[],"annotationNote":"synthetic"}]}]}"#.utf8)
        let manifest = try JSONDecoder().decode(SessionManifest.self, from: data)
        let pair = manifest.pairs[0]
        let url = URL(fileURLWithPath: "/tmp/pose-session/session.json")
        XCTAssertEqual(try manifest.assetURL(for: pair, rider: pair.riders[0], manifestURL: url).lastPathComponent, "subject.png")
        XCTAssertEqual(try manifest.assetURL(for: pair, rider: pair.riders[1], manifestURL: url).lastPathComponent, "reference.png")
        var escaped = pair.riders[1]
        escaped.file = "../outside.png"
        XCTAssertThrowsError(try manifest.assetURL(for: pair, rider: escaped, manifestURL: url))
        escaped.file = "/tmp/outside.png"
        XCTAssertThrowsError(try manifest.assetURL(for: pair, rider: escaped, manifestURL: url))
    }
    func testSingleSubjectSessionDoesNotRequireFabricatedReference() throws {
        let folder = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
        try FileManager.default.createDirectory(at: folder, withIntermediateDirectories: true)
        defer { try? FileManager.default.removeItem(at: folder) }
        let rider = RiderInput(role: "subject", rider: "Test", panel: PixelRect(x: 0, y: 0, width: 10, height: 10),
                               crop: PixelRect(x: 0, y: 0, width: 10, height: 10), annotations: [], annotationNote: "synthetic")
        var manifest = SessionManifest(schemaVersion: 1, session: "Single photos", annotationProvenance: "synthetic",
                                       pairs: [PairInput(id: "S01", file: "photo.jpg", riders: [rider])])
        let url = folder.appendingPathComponent("session.json")
        try JSONEncoder().encode(manifest).write(to: url)
        XCTAssertEqual(try SessionManifest.load(url: url).pairs[0].riders.count, 1)
        manifest.pairs[0].riders.append(rider)
        try JSONEncoder().encode(manifest).write(to: url)
        XCTAssertThrowsError(try SessionManifest.load(url: url))
    }
}
