// 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.

#import "base/task/sequenced_task_runner.h"
#import "google_apis/gaia/gaia_id.h"
#import "ios/public/provider/chrome/browser/push_notification/push_notification_api.h"

namespace ios {
namespace provider {
namespace {

// Domain for test push_notification error API.
NSString* const kTestPushNotificationErrorDomain =
    @"test_push_notification_error_domain";

// Helper method that asynchronously invoke `completion_handler`
// with an `NSFeatureUnsupportedError` on the current sequence.
void FailWithUnsupportedFeatureError(
    PushNotificationService::CompletionHandler completion_handler) {
  base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
      FROM_HERE, base::BindOnce(^() {
        NSError* error =
            [NSError errorWithDomain:kTestPushNotificationErrorDomain
                                code:NSFeatureUnsupportedError
                            userInfo:nil];
        completion_handler(error);
      }));
}

}  // namespace

// Implementation of the PushNotificationService for use by unit tests
class TestPushNotificationService final : public PushNotificationService {
 public:
  // PushNotificationService implementation.
  void RegisterDevice(PushNotificationConfiguration* config,
                      void (^completion_handler)(NSError* error)) final;
  void UnregisterDevice(void (^completion_handler)(NSError* error)) final;
  bool DeviceTokenIsSet() const final;

  std::string GetRepresentativeTargetIdForGaiaId(const GaiaId& gaia_id) final;

 protected:
  // PushNotificationService implementation.
  void SetAccountsToDevice(NSArray<NSString*>* account_ids,
                           CompletionHandler completion_handler) final;
  void SetPreferences(const GaiaId& account_id,
                      PreferenceMap preference_map,
                      CompletionHandler completion_handler) final;
};

void TestPushNotificationService::RegisterDevice(
    PushNotificationConfiguration* config,
    void (^completion_handler)(NSError* error)) {
  // Test implementation does nothing. As a result, the `completion_handler` is
  // called with a NSFeatureUnsupportedError.
  FailWithUnsupportedFeatureError(completion_handler);
}

void TestPushNotificationService::UnregisterDevice(
    void (^completion_handler)(NSError* error)) {
  // Test implementation does nothing. As a result, the `completion_handler` is
  // called with a NSFeatureUnsupportedError.
  FailWithUnsupportedFeatureError(completion_handler);
}

bool TestPushNotificationService::DeviceTokenIsSet() const {
  return false;
}

std::string TestPushNotificationService::GetRepresentativeTargetIdForGaiaId(
    const GaiaId& gaia_id) {
  return "";
}

void TestPushNotificationService::SetAccountsToDevice(
    NSArray<NSString*>* account_ids,
    void (^completion_handler)(NSError* error)) {
  // Test implementation does nothing. As a result, the `completion_handler` is
  // called with a NSFeatureUnsupportedError.
  FailWithUnsupportedFeatureError(completion_handler);
}

void TestPushNotificationService::SetPreferences(
    const GaiaId& account_id,
    PreferenceMap preference_map,
    CompletionHandler completion_handler) {
  // Test implementation does nothing. As a result, the `completion_handler` is
  // called with a NSFeatureUnsupportedError.
  FailWithUnsupportedFeatureError(completion_handler);
}

std::unique_ptr<PushNotificationService> CreatePushNotificationService() {
  return std::make_unique<TestPushNotificationService>();
}
}  // namespace provider
}  // namespace ios
