//
//  Request.swift
//  Pachyderm
//
//  Created by Shadowfacts on 9/8/18.
//  Copyright © 2018 Shadowfacts. All rights reserved.
//

import Foundation

public struct Request<ResultType: Decodable>: Sendable {
    let method: Method
    let endpoint: Endpoint
    let body: Body
    var queryParameters: [Parameter]
    var headers: [String: String] = [:]
    var additionalAcceptableHTTPCodes: [Int] = []
    
    init(method: Method, path: Endpoint, body: Body = EmptyBody(), queryParameters: [Parameter] = []) {
        self.method = method
        self.endpoint = path
        self.body = body
        self.queryParameters = queryParameters
    }
}

extension Request {
    var range: RequestRange {
        get {
            let max = queryParameters.first { $0.name == "max_id" }
            let since = queryParameters.first { $0.name == "since_id" }
            let count = queryParameters.first { $0.name == "count" }
            if let max = max, let count = count {
                return .before(id: max.value!, count: Int(count.value!)!)
            } else if let since = since, let count = count {
                return .after(id: since.value!, count: Int(count.value!)!)
            } else if let count = count {
                return .count(Int(count.value!)!)
            } else {
                return .default
            }
        }
        set {
            let rangeParams = newValue.queryParameters
            for param in rangeParams {
                if let i = queryParameters.firstIndex(where: { $0.name == param.name }) {
                    queryParameters[i] = param
                } else {
                    queryParameters.append(param)
                }
            }
        }
    }
}
