//
//  ZLoginSmokeUITests.swift
//  suixinkanUITests
//
//  命名以 Z 开头，确保在全套件末尾执行，避免清空 Keychain 影响其它用例。
//

import XCTest

final class ZLoginSmokeUITests: XCTestCase {
    override func setUp() {
        super.setUp()
        continueAfterFailure = false
        UITestSession.invalidate()
    }

    override func tearDown() {
        UITestSession.invalidate()
        super.tearDown()
    }

    /// 测试冷启动会展示登录页关键控件。
    func testFreshLaunchShowsLoginScreen() {
        let app = SuixinkanApp(resetState: true).launch(waitForLoading: false)

        XCTAssertTrue(app.application.staticTexts["login.title"].waitForExistence(timeout: 8))
        XCTAssertTrue(app.application.textFields["login.username"].exists)
        XCTAssertTrue(
            app.application.secureTextFields["login.password"].exists
                || app.application.textFields["login.password"].exists
        )
        XCTAssertTrue(app.application.buttons["login.submit"].exists)
        XCTAssertTrue(app.application.buttons["login.userAgreement"].exists)
        XCTAssertTrue(app.application.buttons["login.privacyPolicy"].exists)
        app.application.terminate()
    }

    /// 测试未勾选协议时无法直接登录。
    func testLoginRequiresPrivacyAgreement() throws {
        let app = SuixinkanApp(resetState: true).launch(waitForLoading: false)
        defer { app.application.terminate() }
        guard UITestLaunchConfiguration.credentials != nil else {
            throw XCTSkip("缺少 UI Test 账号。")
        }

        let usernameField = app.application.textFields["login.username"]
        XCTAssertTrue(usernameField.waitForExistence(timeout: 8))
        XCTAssertFalse(app.application.buttons["login.submit"].isEnabled)
    }

    /// 测试空密码不会离开登录页。
    func testEmptyPasswordDoesNotLeaveLoginScreen() throws {
        let app = SuixinkanApp(resetState: true).launch(waitForLoading: false)
        defer { app.application.terminate() }
        let credentials = try UITestLaunchConfiguration.requireCredentials()

        let usernameField = app.application.textFields["login.username"]
        XCTAssertTrue(usernameField.waitForExistence(timeout: 8))
        usernameField.tap()
        usernameField.typeText(credentials.phone)

        let privacyToggle = app.application.buttons["login.privacy"]
        if privacyToggle.exists {
            privacyToggle.tap()
        }

        app.application.buttons["login.submit"].tap()
        app.waitForGlobalLoadingToDisappear(timeout: 5)
        XCTAssertTrue(app.isOnLoginScreen)
    }
}
