//
//  APIRequest.swift
//  suixinkan
//
//  Created by Codex on 2026/6/18.
//

import Foundation

/// HTTP 方法实体，限制网络层支持的请求方法。
enum HTTPMethod: String {
    case get = "GET"
    case post = "POST"
    case put = "PUT"
    case delete = "DELETE"
}

/// 强类型 API 请求实体，描述一次请求的方法、路径、参数、Header 和响应类型。
struct APIRequest<Response: Decodable> {
    var method: HTTPMethod
    var path: String
    var queryItems: [URLQueryItem]
    var headers: [String: String]
    var body: AnyEncodable?

    /// 创建一个 API 请求，并把可编码请求体擦除为统一的 AnyEncodable。
    init<Body: Encodable>(
        method: HTTPMethod,
        path: String,
        queryItems: [URLQueryItem] = [],
        headers: [String: String] = [:],
        body: Body? = Optional<EmptyPayload>.none
    ) {
        self.method = method
        self.path = path
        self.queryItems = queryItems
        self.headers = headers
        self.body = body.map(AnyEncodable.init)
    }
}

/// Encodable 类型擦除包装器，用于在 APIRequest 中保存任意请求体。
struct AnyEncodable: Encodable {
    private let encodeValue: (Encoder) throws -> Void

    /// 包装任意 Encodable 请求体。
    nonisolated init<Value: Encodable>(_ value: Value) {
        encodeValue = value.encode(to:)
    }

    /// 将被包装的请求体编码到目标 Encoder。
    nonisolated func encode(to encoder: Encoder) throws {
        try encodeValue(encoder)
    }
}
