import XCTest
@testable import RideForm

final class WatchTransferTests: XCTestCase {
    func testReceivedArchiveIsCopiedBeforeTemporarySourceDisappearsAndNeverOverwrites() throws {
        let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
        try FileManager.default.createDirectory(at: root, withIntermediateDirectories: true)
        let source = root.appendingPathComponent("temporary")
        let bytes = Data([0x50, 0x4b, 0, 1, 2, 255])
        try bytes.write(to: source)
        let inbox = root.appendingPathComponent("Inbox")
        let first = try WatchSessionTransfer.retainIncoming(source, in: inbox)
        let second = try WatchSessionTransfer.retainIncoming(source, in: inbox)
        try FileManager.default.removeItem(at: source)
        XCTAssertNotEqual(first, second)
        XCTAssertEqual(try Data(contentsOf: first), bytes)
        XCTAssertEqual(try Data(contentsOf: second), bytes)
        XCTAssertEqual(first.deletingLastPathComponent().path, inbox.path)
        XCTAssertEqual(first.pathExtension, "zip")
    }
    func testFailedIncomingCopyDoesNotCreateAnArchive() throws {
        let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
        XCTAssertThrowsError(try WatchSessionTransfer.retainIncoming(root.appendingPathComponent("missing"), in: root))
        XCTAssertTrue(try FileManager.default.contentsOfDirectory(atPath: root.path).isEmpty)
    }
    func testOutboxCleanupPreservesPendingTransfersAndOriginals() throws {
        let root = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
        let outbox = root.appendingPathComponent("WatchOutbox", isDirectory: true)
        try FileManager.default.createDirectory(at: outbox, withIntermediateDirectories: true)
        let original = root.appendingPathComponent("original.rideform")
        let pending = outbox.appendingPathComponent("pending.zip")
        let completed = outbox.appendingPathComponent("completed.zip")
        let bytes = Data([1, 2, 3])
        for url in [original, pending, completed] { try bytes.write(to: url) }
        try WatchSessionTransfer.cleanOutbox(outbox, preserving: [pending])
        XCTAssertEqual(try Data(contentsOf: original), bytes)
        XCTAssertEqual(try Data(contentsOf: pending), bytes)
        XCTAssertFalse(FileManager.default.fileExists(atPath: completed.path))
    }
}
