import XCTest
@testable import lichunWebsocket

final class LiveActivitySnapshotTests: XCTestCase {
    func testContentStateUsesOnlyGlanceableCharacterState() {
        let person = Person()
        person.id = "char-live-1"
        person.firstname = "Alex"
        person.lastname = "River"
        person.ageYears = 18
        person.location = "Campus"
        person.intraDayMessage = "Studying for finals"
        person.calcEnergy = 72
        person.health = 91
        person.happiness = 64
        person.status = "alive"

        let player = Player()
        player.date = "05-26"
        player.hourOfDay = 14
        player.minuteOfHour = 7
        player.season = "spring"
        player.gameSpeed = Constants.GameSpeed.normal

        let state = LiveActivitySnapshotBuilder.makeContentState(
            person: person,
            player: player,
            isRunning: true,
            now: Date(timeIntervalSince1970: 1_779_804_000)
        )

        XCTAssertEqual(state.gameDate, "05-26")
        XCTAssertEqual(state.gameTime, "2:07 PM")
        XCTAssertEqual(state.age, 18)
        XCTAssertEqual(state.season, "spring")
        XCTAssertEqual(state.location, "Campus")
        XCTAssertEqual(state.statusMessage, "Studying for finals")
        XCTAssertEqual(state.energy, 72)
        XCTAssertEqual(state.health, 91)
        XCTAssertEqual(state.happiness, 64)
        XCTAssertEqual(state.speedLabel, "Normal")
        XCTAssertTrue(state.isRunning)
        XCTAssertEqual(state.updatedAt, "2026-05-26T14:00:00Z")
    }

    func testLocalUpdateThrottleAllowsMajorChanges() {
        let lastUpdate = Date(timeIntervalSince1970: 100)

        XCTAssertFalse(
            LiveActivityUpdateThrottle.shouldUpdate(
                lastUpdate: lastUpdate,
                now: Date(timeIntervalSince1970: 110),
                majorChange: false
            )
        )

        XCTAssertTrue(
            LiveActivityUpdateThrottle.shouldUpdate(
                lastUpdate: lastUpdate,
                now: Date(timeIntervalSince1970: 110),
                majorChange: true
            )
        )

        XCTAssertTrue(
            LiveActivityUpdateThrottle.shouldUpdate(
                lastUpdate: lastUpdate,
                now: Date(timeIntervalSince1970: 116),
                majorChange: false
            )
        )
    }

    func testPromptPolicyOnlyPromptsOnceWhenPlayableAndAvailable() {
        let person = Person()
        person.id = "char-live-1"
        person.firstname = "Alex"
        person.status = "alive"

        let player = Player()
        player.status = "playing"

        XCTAssertTrue(
            LiveActivityPromptPolicy.shouldShowPrompt(
                promptAsked: false,
                isAvailable: true,
                isPlayable: LiveActivityPromptPolicy.isPlayable(person: person, player: player)
            )
        )

        XCTAssertFalse(
            LiveActivityPromptPolicy.shouldShowPrompt(
                promptAsked: true,
                isAvailable: true,
                isPlayable: LiveActivityPromptPolicy.isPlayable(person: person, player: player)
            )
        )
    }

    func testAvatarFallbackInitials() {
        XCTAssertEqual(LiveActivityAvatarFallback.initials(for: "Alex River"), "AR")
        XCTAssertEqual(LiveActivityAvatarFallback.initials(for: ""), "B")
    }
}
