/**
 * Tribufu API
 * REST API to access Tribufu services.
 *
 * The version of the OpenAPI document: 1.1.0
 * Contact: contact@tribufu.com
 *
 * NOTE: This class is auto generated by OpenAPI-Generator 7.12.0.
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */

/*
 * ApiClient.h
 *
 * This is an API client responsible for stating the HTTP calls
 */

#ifndef TRIBUFU_API_ApiClient_H_
#define TRIBUFU_API_ApiClient_H_

#include "tribufu++/ApiConfiguration.h"
#include "tribufu++/ApiException.h"
#include "tribufu++/HttpContent.h"
#include "tribufu++/IHttpBody.h"

#if defined(_WIN32) || defined(_WIN64)
#undef U
#endif

#include <cpprest/details/basic_types.h>
#include <cpprest/http_client.h>

#include <functional>
#include <memory>
#include <vector>

namespace tribufu
{
    namespace api
    {

        using namespace tribufu::models;

        class ApiClient
        {
        public:
            ApiClient(std::shared_ptr<const ApiConfiguration> configuration = nullptr);
            virtual ~ApiClient();

            typedef std::function<void(web::http::status_code, const web::http::http_headers &)> ResponseHandlerType;

            const ResponseHandlerType &getResponseHandler() const;
            void setResponseHandler(const ResponseHandlerType &responseHandler);

            std::shared_ptr<const ApiConfiguration> getConfiguration() const;
            void setConfiguration(std::shared_ptr<const ApiConfiguration> configuration);

            static utility::string_t parameterToString(utility::string_t value);
            static utility::string_t parameterToString(int32_t value);
            static utility::string_t parameterToString(int64_t value);
            static utility::string_t parameterToString(float value);
            static utility::string_t parameterToString(double value);
            static utility::string_t parameterToString(const utility::datetime &value);
            static utility::string_t parameterToString(bool value);
            template <class T> static utility::string_t parameterToString(const std::vector<T> &value);
            template <class T> static utility::string_t parameterToString(const std::shared_ptr<T> &value);

            pplx::task<web::http::http_response> callApi(
                const utility::string_t &path, const utility::string_t &method,
                const std::map<utility::string_t, utility::string_t> &queryParams,
                const std::shared_ptr<IHttpBody> postBody,
                const std::map<utility::string_t, utility::string_t> &headerParams,
                const std::map<utility::string_t, utility::string_t> &formParams,
                const std::map<utility::string_t, std::shared_ptr<HttpContent>> &fileParams,
                const utility::string_t &contentType) const;

        protected:
            ResponseHandlerType m_ResponseHandler;
            std::shared_ptr<const ApiConfiguration> m_Configuration;
        };

        template <class T> utility::string_t ApiClient::parameterToString(const std::vector<T> &value)
        {
            utility::stringstream_t ss;

            for (size_t i = 0; i < value.size(); i++)
            {
                if (i > 0)
                    ss << utility::conversions::to_string_t(", ");
                ss << ApiClient::parameterToString(value[i]);
            }

            return ss.str();
        }

        template <class T> utility::string_t ApiClient::parameterToString(const std::shared_ptr<T> &value)
        {
            return parameterToString(*value.get());
        }

    }
}

#endif /* TRIBUFU_API_ApiClient_H_ */