# NOTE: This file is auto generated by OpenAPI Generator 7.0.1 (https://openapi-generator.tech).
# Do not edit this file manually.

defmodule DockerEngineAPI.Connection do
  @moduledoc """
  Handle Tesla connections for DockerEngineAPI.
  """

  @default_options [
    base_url: "http://localhost/v1.43",
    adapter: Tesla.Adapter.Hackney
  ]

  @typedoc """
  The list of options that can be passed to new/1.

  - `base_url`: Overrides the base URL on a per-client basis.
  - `user_agent`: Overrides the User-Agent header.
  """
  @type options :: [
          {:base_url, String.t()},
          {:user_agent, String.t()}
        ]

  @doc "Forward requests to Tesla."
  @spec request(Tesla.Client.t(), [Tesla.option()]) :: Tesla.Env.result()
  defdelegate request(client, options), to: Tesla

  @doc """
  Configure a client that may have authentication.

  ### Parameters

  - `options`: a keyword list of OpenAPIPetstore.Connection.options.

  ### Returns

  Tesla.Env.client
  """
  @spec new(options) :: Tesla.Env.client()

  def new(options \\ []) when is_list(options) do
    options = @default_options |> Keyword.merge(options)

    options
    |> Keyword.merge(options)
    |> middleware()
    |> Tesla.client(adapter(options))
  end

  @doc """
  Returns fully configured middleware for passing to Tesla.client/2.
  """
  @spec middleware(options) :: [Tesla.Client.middleware()]
  def middleware(options \\ []) do
    base_url = Keyword.get(options, :base_url)

    tesla_options = get_tesla_options()
    middleware = Keyword.get(tesla_options, :middleware, [])
    json_engine = Keyword.get(tesla_options, :json, Jason)

    user_agent =
      Keyword.get(
        options,
        :user_agent,
        Keyword.get(
          tesla_options,
          :user_agent,
          "openapi-generator - DockerEngineAPI 1.43 - elixir"
        )
      )

    [
      {Tesla.Middleware.BaseUrl, base_url},
      {Tesla.Middleware.Headers, [{"user-agent", user_agent}]},
      {Tesla.Middleware.EncodeJson, engine: json_engine}
      | middleware
    ]
  end

  def get_tesla_options, do: Application.get_env(:tesla, __MODULE__, [])

  @doc """
  Returns the default adapter for this API.
  """
  def adapter(options \\ []) do
    case Keyword.get(
           options,
           :adapter,
           Keyword.get(get_tesla_options(), :adapter, nil)
         ) do
      Tesla.Adapter.Hackney ->
        {Tesla.Adapter.Hackney, [recv_timeout: Keyword.get(options, :recv_timeout, 1_000)]}

      other ->
        other
    end
  end
end
