//
// Created by Tobias on 14.07.20.
// Copyright (c) 2020 Tobias. All rights reserved.
//

import Foundation

public class RequestBuilder
{
    private init() {
    }

    public static func create() -> RequestBuilder {
        RequestBuilder()
    }

    private var url: String = ""
    private var method: Request.RequestMethod = .get
    private var authentication: Authentication?
    private var parameters: [String: String] = [:]
    private var payload: Data?
    private var contentType: String?
    private var timeout: TimeInterval?

    public func url(_ url: String) -> RequestBuilder {
        self.url = url
        return self
    }

    public func method(_ method: Request.RequestMethod) -> RequestBuilder {
        self.method = method
        return self
    }

    public func authentication(_ authentication: Authentication) -> RequestBuilder {
        self.authentication = authentication
        return self
    }

    public func parameters(_ parameters: [String: String]) -> RequestBuilder {
        self.parameters = parameters
        return self
    }

    public func addParameter(key: String, value: String) -> RequestBuilder {
        self.parameters[key] = value
        return self
    }

    public func payload(_ payload: Data?) -> RequestBuilder {
        self.payload = payload
        self.contentType = "application/json"
        return self
    }

    public func formPayload(_ payload: [String: Any]) -> RequestBuilder {
        self.payload = payload.percentEncoded()
        self.contentType = "application/x-www-form-urlencoded"
        return self
    }

    public func timeout(timeout: TimeInterval) -> RequestBuilder {
        self.timeout = timeout
        return self
    }
    
    public func build() -> Request {
        Request(url: url, method: method, authentication: authentication, parameters: parameters, payload: payload, contentType: contentType, timeout: timeout)
    }
}