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

#ifndef CHROME_BROWSER_ASH_NET_APN_MIGRATOR_H_
#define CHROME_BROWSER_ASH_NET_APN_MIGRATOR_H_

#include "base/containers/flat_set.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chromeos/ash/components/network/network_state_handler.h"
#include "chromeos/ash/components/network/network_state_handler_observer.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
#include "mojo/public/cpp/bindings/remote.h"

namespace ash {

class ManagedCellularPrefHandler;
class ManagedNetworkConfigurationHandler;
class NetworkMetadataStore;
class NetworkStateHandler;

// Handles migrating cellular networks' Access Point Names from the pre-revamp
// format to the revamped format (see go/launch/4210741) the first time each
// network is discovered with the kApnRevamp flag enabled.
class COMPONENT_EXPORT(CHROMEOS_NETWORK) ApnMigrator
    : public NetworkStateHandlerObserver {
 public:
  ApnMigrator(
      ManagedCellularPrefHandler* managed_cellular_pref_handler,
      ManagedNetworkConfigurationHandler* managed_network_configuration_handler,
      NetworkStateHandler* network_state_handler);
  ApnMigrator() = delete;
  ApnMigrator(const ApnMigrator&) = delete;
  ApnMigrator& operator=(const ApnMigrator&) = delete;
  ~ApnMigrator() override;

 private:
  friend class ApnMigratorTest;

  // NetworkStateHandlerObserver:
  void NetworkListChanged() override;

  void OnClearPropertiesSuccess(const std::string iccid);
  void OnClearPropertiesFailure(const std::string iccid,
                                const std::string guid,
                                const std::string& error_name);

  // Creates an ONC configuration object for the custom APN list Shill property
  // containing |apn_list|, and applies it for the cellular |network|.
  void SetShillCustomApnListForNetwork(const NetworkState& network,
                                       const base::Value::List* apn_list);

  void OnSetShillCustomApnListSuccess(const std::string iccid);
  void OnSetShillCustomApnListFailure(const std::string iccid,
                                      const std::string guid,
                                      const std::string& error_name);

  // Migrate the |network|'s custom APNs to the APN Revamp feature. If the
  // migration requires the network's managed properties, this function will
  // invoke an async call, and mark the network as "in migration".
  void MigrateNetwork(const NetworkState& network);

  // Finishes the migration process for networks that require managed properties
  // fields.
  void OnGetManagedProperties(std::string iccid,
                              std::string guid,
                              const std::string& service_path,
                              std::optional<base::Value::Dict> properties,
                              std::optional<std::string> error);

  // Helper func that creates the |default_apn| before creating the
  // |attach_apn|. If |can_use_default_apn_as_attach| is true, the |default_apn|
  // will be given the capability to attach as well.
  void CreateDefaultThenAttachCustomApns(
      chromeos::network_config::mojom::ApnPropertiesPtr attach_apn,
      chromeos::network_config::mojom::ApnPropertiesPtr default_apn,
      bool can_use_default_apn_as_attach,
      const std::string& guid,
      const std::string& iccid);

  void CreateCustomApn(const std::string& iccid,
                       const std::string& network_guid,
                       chromeos::network_config::mojom::ApnPropertiesPtr apn,
                       std::optional<base::OnceCallback<void(bool)>>
                           success_callback = std::nullopt);

  void CompleteMigrationAttempt(const std::string& iccid, bool success);

  base::flat_set<std::string> extract_iccids(
      NetworkStateHandler::NetworkStateList& network_list);

  bool has_iccids_changed(base::flat_set<std::string> new_iccids,
                          base::flat_set<std::string> old_iccids);

  void ResetOldIccidsForTesting();

  NetworkMetadataStore* GetNetworkMetadataStore();

  void set_network_metadata_store_for_testing(
      NetworkMetadataStore* network_metadata_store_for_testing) {
    network_metadata_store_for_testing_ = network_metadata_store_for_testing;
  }

  // ICCIDs that are currently being migrated.
  base::flat_set<std::string> iccids_in_migration_;

  // ICCIDs of networks that have been configured in shill with the appropriate
  // CustomAPNList. Networks must be updated in shill with the CustomAPNList
  // property each time the revamp flag is toggled.
  base::flat_set<std::string> shill_updated_iccids_;

  base::flat_set<std::string> old_iccids_;

  raw_ptr<ManagedCellularPrefHandler> managed_cellular_pref_handler_ = nullptr;
  raw_ptr<ManagedNetworkConfigurationHandler> network_configuration_handler_ =
      nullptr;
  raw_ptr<NetworkStateHandler> network_state_handler_ = nullptr;

  // NetworkMetadataStore may be created and destroyed multiple times
  // in ApnMigrator's lifetime, so a reference to NetworkMetadataStore
  // should not be held. See http://b/285014794#comment19 for more info.
  // Note that this should only be non-nullptr in unit tests.
  raw_ptr<NetworkMetadataStore> network_metadata_store_for_testing_ = nullptr;

  // Remote for sending requests to the CrosNetworkConfig service.
  mojo::Remote<chromeos::network_config::mojom::CrosNetworkConfig>
      remote_cros_network_config_;

  base::ScopedObservation<NetworkStateHandler, NetworkStateHandlerObserver>
      network_state_handler_observer_{this};
  base::WeakPtrFactory<ApnMigrator> weak_factory_{this};
};

}  // namespace ash

#endif  // CHROME_BROWSER_ASH_NET_APN_MIGRATOR_H_
