import XCTest
@testable import VniDrop

/// Ports `ui/feedback/UiMessageControllerTest.kt` and `UserFacingErrorTest.kt`.
@MainActor
final class UiMessageControllerTests: XCTestCase {

	func testQueuesAndAdvances() {
		let c = UiMessageController()
		c.show(UiMessage(text: .dynamic("first")))
		c.show(UiMessage(text: .dynamic("second")))
		XCTAssertEqual(c.current?.text, .dynamic("first"))

		c.advance()
		XCTAssertEqual(c.current?.text, .dynamic("second"))

		c.advance()
		XCTAssertNil(c.current)
	}

	func testErrorSuppressesUserCancellation() {
		let c = UiMessageController()
		c.error(InvitationError.message("QR scanning was cancelled"))
		XCTAssertNil(c.current) // cancellations are swallowed
	}

	func testErrorShowsNonCancellation() {
		let c = UiMessageController()
		c.error(InvitationError.message("The transfer was refused"))
		XCTAssertEqual(c.current?.tone, .error)
	}
}

@MainActor
final class UserFacingErrorTests: XCTestCase {

	func testIsUserCancellation() {
		XCTAssertTrue(InvitationError.message("NFC reading was cancelled").isUserCancellation)
		XCTAssertTrue(InvitationError.message("User canceled the picker").isUserCancellation)
		XCTAssertFalse(InvitationError.message("A database error occurred").isUserCancellation)
	}

	func testToUiTextMapsKnownReasons() {
		XCTAssertEqual(InvitationError.message("The transfer was refused").toUiText(), .resource("error_permission"))
		XCTAssertEqual(InvitationError.message("invalid ticket").toUiText(), .resource("error_invalid_ticket"))
		XCTAssertEqual(InvitationError.message("Select at least one file to share").toUiText(), .resource("error_share_empty"))
		XCTAssertEqual(InvitationError.message("Camera access is required").toUiText(), .resource("error_camera"))
	}

	func testToUiTextFallsBackToGeneric() {
		XCTAssertEqual(InvitationError.message("something entirely unexpected").toUiText(), .resource("error_generic"))
	}
}
