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

#ifndef HERMES_SMDP_H_
#define HERMES_SMDP_H_

#include <memory>
#include <string>

#include <brillo/http/http_request.h>
#include <brillo/http/http_transport.h>
#include <google-lpa/lpa/smdx/smdp_client.h>
#include <google-lpa/lpa/smdx/smdp_client_factory.h>

#include "hermes/executor.h"
#include "hermes/logger.h"

namespace hermes {

class SmdpFactory : public lpa::smdp::SmdpClientFactory {
 public:
  SmdpFactory(Logger* logger, Executor* executor);

  std::unique_ptr<lpa::smdp::SmdpClient> NewSmdpClient(
      std::string tls_certs_dir,
      std::string smdp_addr,
      const lpa::proto::EuiccSpecVersion& card_verison) override;

 private:
  // Objects owned by the Daemon instance.
  Logger* logger_;
  Executor* executor_;
};

// Class to facilitate communication between the LPD and SM-DP+
// server. Responsible for opening, maintaining, and closing an
// HTTPS connection with the SM-DP+ server.
class Smdp : public lpa::smdp::SmdpClient {
 public:
  using LpaCallback =
      std::function<void(int code, std::string& http_resp, int err)>;

  Smdp(std::string server_addr,
       std::string certs_dir,
       Logger* logger,
       Executor* executor);

  // lpa::smdp::SmdpClient override.
  lpa::util::EuiccLog* logger() override;

 protected:
  // lpa::smdp::SmdpClient overrides.
  lpa::util::Executor* executor() override;
  void SendHttps(const std::string& path,
                 const std::string& request,
                 LpaCallback cb) override;

 private:
  void OnHttpsResponse(LpaCallback cb,
                       brillo::http::RequestID request_id,
                       std::unique_ptr<brillo::http::Response> response);

  void OnHttpsError(LpaCallback cb,
                    brillo::http::RequestID request_id,
                    const brillo::Error* error);

  std::shared_ptr<brillo::http::Transport> server_transport_;

  // Objects owned by the Daemon instance.
  Logger* logger_;
  Executor* executor_;

  base::WeakPtrFactory<Smdp> weak_factory_;
};

}  // namespace hermes

#endif  // HERMES_SMDP_H_
