//
//  LocationReportHistoryViewModelTests.swift
//  suixinkanTests
//

import XCTest
@testable import suixinkan

@MainActor
/// 位置上报历史 ViewModel 测试。
final class LocationReportHistoryViewModelTests: XCTestCase {

    private var appStore: AppStore!
    private var defaults: UserDefaults!

    override func setUp() {
        defaults = UserDefaults(suiteName: "LocationReportHistoryViewModelTests")!
        defaults.removePersistentDomain(forName: "LocationReportHistoryViewModelTests")
        appStore = AppStore(defaults: defaults)
        appStore.session.userId = "staff-99"
    }

    override func tearDown() {
        appStore.logout()
        super.tearDown()
    }

    func testLoadReportListPopulatesItems() async throws {
        let listJSON = """
        {"code":100000,"msg":"success","data":{"list":[{"id":1,"staff_id":99,"type":1,"latitude":"30.1","longitude":"120.2","address":"测试地址","remark":"","created_at":"2026-01-01 10:00:00"}],"total":1}}
        """.data(using: .utf8)!
        let api = HomeAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [listJSON])))
        let viewModel = LocationReportHistoryViewModel(appStore: appStore)

        await viewModel.loadReportList(api: api, refresh: true)

        XCTAssertEqual(viewModel.reportList.count, 1)
        XCTAssertEqual(viewModel.reportList.first?.address, "测试地址")
        XCTAssertFalse(viewModel.canLoadMore)
    }

    func testSelectFilterReloadsWithTypeCode() async throws {
        let allJSON = """
        {"code":100000,"msg":"success","data":{"list":[{"id":1,"staff_id":99,"type":1,"latitude":"30","longitude":"120","address":"A","remark":"","created_at":"2026-01-01 10:00:00"}],"total":1}}
        """.data(using: .utf8)!
        let markedJSON = """
        {"code":100000,"msg":"success","data":{"list":[{"id":2,"staff_id":99,"type":2,"latitude":"31","longitude":"121","address":"B","remark":"","created_at":"2026-01-02 10:00:00"}],"total":1}}
        """.data(using: .utf8)!
        let api = HomeAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [allJSON, markedJSON])))
        let viewModel = LocationReportHistoryViewModel(appStore: appStore)

        await viewModel.loadReportList(api: api, refresh: true)
        await viewModel.selectFilter(.marked, api: api)

        XCTAssertEqual(viewModel.selectedFilter, .marked)
        XCTAssertEqual(viewModel.reportList.first?.type, 2)
        XCTAssertEqual(viewModel.reportList.first?.address, "B")
    }

    func testPaginationAppendsItems() async throws {
        let page1JSON = """
        {"code":100000,"msg":"success","data":{"list":[{"id":1,"staff_id":99,"type":1,"latitude":"30","longitude":"120","address":"第一页","remark":"","created_at":"2026-01-01 10:00:00"}],"total":2}}
        """.data(using: .utf8)!
        let page2JSON = """
        {"code":100000,"msg":"success","data":{"list":[{"id":2,"staff_id":99,"type":1,"latitude":"31","longitude":"121","address":"第二页","remark":"","created_at":"2026-01-02 10:00:00"}],"total":2}}
        """.data(using: .utf8)!
        let api = HomeAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [page1JSON, page2JSON])))
        let viewModel = LocationReportHistoryViewModel(appStore: appStore)

        await viewModel.loadReportList(api: api, refresh: true)
        await viewModel.loadMoreIfNeeded(currentIndex: 0, api: api)

        XCTAssertEqual(viewModel.reportList.count, 2)
        XCTAssertEqual(viewModel.reportList.last?.address, "第二页")
        XCTAssertFalse(viewModel.canLoadMore)
    }
}
