// Copyright 2020 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_EUICC_H_
#define HERMES_EUICC_H_

#include <memory>
#include <string>
#include <vector>

#include <google-lpa/lpa/core/lpa.h>
#include <google-lpa/lpa/data/proto/profile_info.pb.h>

#include "hermes/adaptor_interfaces.h"
#include "hermes/context.h"
#include "hermes/euicc_slot_info.h"
#include "hermes/profile.h"
#include "hermes/result_callback.h"

namespace hermes {

class Euicc {
 public:
  Euicc(uint8_t physical_slot, EuiccSlotInfo slot_info);
  Euicc(const Euicc&) = delete;
  Euicc& operator=(const Euicc&) = delete;

  void UpdateSlotInfo(EuiccSlotInfo slot_info);
  void UpdateLogicalSlot(base::Optional<uint8_t> logical_slot);

  // Install a profile. An empty activation code will cause the default profile
  // to be installed.
  void InstallProfileFromActivationCode(
      std::string activation_code,
      std::string confirmation_code,
      ResultCallback<dbus::ObjectPath> result_callback);
  void UninstallProfile(dbus::ObjectPath profile_path,
                        ResultCallback<> result_callback);
  // Request the eUICC to provide all installed profiles.
  void RequestInstalledProfiles(ResultCallback<> result_callback);

  void InstallPendingProfile(dbus::ObjectPath profile_path,
                             std::string confirmation_code,
                             ResultCallback<dbus::ObjectPath> result_callback);
  void RequestPendingProfiles(ResultCallback<> result_callback,
                              std::string root_smds);
  void SetTestMode(ResultCallback<> result_callback, bool is_test_mode);
  void UseTestCerts(bool use_test_certs);
  void ResetMemory(ResultCallback<> result_callback, int reset_options);

  uint8_t physical_slot() const { return physical_slot_; }
  dbus::ObjectPath object_path() const { return dbus_adaptor_->object_path(); }

 private:
  void OnProfileInstalled(const lpa::proto::ProfileInfo& profile_info,
                          int error,
                          ResultCallback<dbus::ObjectPath> result_callback);
  void OnProfileUninstalled(const dbus::ObjectPath& profile_path,
                            int error,
                            ResultCallback<> result_callback);

  void UpdateInstalledProfilesProperty();

  // Update |installed_profiles_| with all profiles installed on the eUICC.
  void OnInstalledProfilesReceived(
      const std::vector<lpa::proto::ProfileInfo>& profile_infos,
      int error,
      ResultCallback<> result_callback);

  // Update |pending_profiles_| with all profiles installed on the SMDS.
  void UpdatePendingProfilesProperty();
  void OnPendingProfilesReceived(
      const std::vector<lpa::proto::ProfileInfo>& profile_infos,
      int error,
      ResultCallback<> result_callback);

  const uint8_t physical_slot_;
  EuiccSlotInfo slot_info_;

  Context* context_;
  std::unique_ptr<EuiccAdaptorInterface> dbus_adaptor_;

  std::vector<std::unique_ptr<Profile>> installed_profiles_;
  std::vector<std::unique_ptr<Profile>> pending_profiles_;

  base::WeakPtrFactory<Euicc> weak_factory_;
};

}  // namespace hermes

#endif  // HERMES_EUICC_H_
