//
//  NetworkServices.swift
//  suixinkan
//

import Foundation

@MainActor
/// 全局网络依赖容器，集中提供 APIClient 与各业务 API。
final class NetworkServices {
    static let shared = NetworkServices()

    let apiClient: APIClient
    let authAPI: AuthAPI
    let profileAPI: ProfileAPI
    let statisticsAPI: StatisticsAPI
    let orderAPI: OrderAPI
    let homeAPI: HomeAPI
    let paymentAPI: PaymentAPI
    let taskAPI: TaskAPI
    let inviteAPI: InviteAPI
    let walletAPI: WalletAPI
    let scenicQueueAPI: ScenicQueueAPI
    let travelAlbumAPI: TravelAlbumAPI
    let sampleManagementAPI: SampleManagementAPI
    let liveAPI: LiveAPI
    let uploadAPI: UploadAPI
    let ossUploadService: OSSUploadService

    private init() {
        let client = APIClient(environment: .current)
        apiClient = client
        authAPI = AuthAPI(client: client)
        profileAPI = ProfileAPI(client: client)
        statisticsAPI = StatisticsAPI(client: client)
        orderAPI = OrderAPI(client: client)
        homeAPI = HomeAPI(client: client)
        paymentAPI = PaymentAPI(client: client)
        taskAPI = TaskAPI(client: client)
        inviteAPI = InviteAPI(client: client)
        walletAPI = WalletAPI(client: client)
        scenicQueueAPI = ScenicQueueAPI(client: client)
        travelAlbumAPI = TravelAlbumAPI(client: client)
        sampleManagementAPI = SampleManagementAPI(client: client)
        liveAPI = LiveAPI(client: client)
        uploadAPI = UploadAPI(client: client)
        ossUploadService = OSSUploadService(configService: uploadAPI)
        client.bindAuthTokenProvider {
            let token = AppStore.shared.token.trimmingCharacters(in: .whitespacesAndNewlines)
            return token.isEmpty ? nil : token
        }
    }

    /// 测试专用初始化，允许注入 mock `APIClient`。
    init(apiClient: APIClient) {
        self.apiClient = apiClient
        authAPI = AuthAPI(client: apiClient)
        profileAPI = ProfileAPI(client: apiClient)
        statisticsAPI = StatisticsAPI(client: apiClient)
        orderAPI = OrderAPI(client: apiClient)
        homeAPI = HomeAPI(client: apiClient)
        paymentAPI = PaymentAPI(client: apiClient)
        taskAPI = TaskAPI(client: apiClient)
        inviteAPI = InviteAPI(client: apiClient)
        walletAPI = WalletAPI(client: apiClient)
        scenicQueueAPI = ScenicQueueAPI(client: apiClient)
        travelAlbumAPI = TravelAlbumAPI(client: apiClient)
        sampleManagementAPI = SampleManagementAPI(client: apiClient)
        liveAPI = LiveAPI(client: apiClient)
        uploadAPI = UploadAPI(client: apiClient)
        ossUploadService = OSSUploadService(configService: uploadAPI)
    }
}
