// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_IMPL_H_
#define NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_IMPL_H_

#include <map>
#include <memory>
#include <string>
#include <type_traits>

#include "base/compiler_specific.h"
#include "base/threading/thread_checker.h"
#include "base/values.h"
#include "net/base/net_export.h"
#include "net/http/http_network_session.h"
#include "net/socket/client_socket_pool_manager.h"
#include "net/socket/connect_job.h"

namespace net {

class ProxyServer;
class ClientSocketPool;

class NET_EXPORT_PRIVATE ClientSocketPoolManagerImpl
    : public ClientSocketPoolManager {
 public:
  // |websocket_common_connect_job_params| is only used for direct WebSocket
  // connections (No proxy in use). It's never used if |pool_type| is not
  // HttpNetworkSession::SocketPoolType::WEBSOCKET_SOCKET_POOL.
  ClientSocketPoolManagerImpl(
      const CommonConnectJobParams& common_connect_job_params,
      const CommonConnectJobParams& websocket_common_connect_job_params,
      HttpNetworkSession::SocketPoolType pool_type,
      bool cleanup_on_ip_address_change = true);

  ClientSocketPoolManagerImpl(const ClientSocketPoolManagerImpl&) = delete;
  ClientSocketPoolManagerImpl& operator=(const ClientSocketPoolManagerImpl&) =
      delete;

  ~ClientSocketPoolManagerImpl() override;

  void FlushSocketPoolsWithError(int net_error,
                                 const char* net_log_reason_utf8) override;
  void CloseIdleSockets(const char* net_log_reason_utf8) override;

  ClientSocketPool* GetSocketPool(const ProxyServer& proxy_server) override;

  // Creates a Value summary of the state of the socket pools.
  base::Value SocketPoolInfoToValue() const override;

 private:
  using SocketPoolMap =
      std::map<ProxyServer, std::unique_ptr<ClientSocketPool>>;

  const CommonConnectJobParams common_connect_job_params_;
  // Used only for direct WebSocket connections (i.e., no proxy in use).
  const CommonConnectJobParams websocket_common_connect_job_params_;

  const HttpNetworkSession::SocketPoolType pool_type_;

  const bool cleanup_on_ip_address_change_;

  SocketPoolMap socket_pools_;

  THREAD_CHECKER(thread_checker_);
};

}  // namespace net

#endif  // NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_IMPL_H_
