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

#import "ios/chrome/intents_extension/chrome_intents_handler.h"

#import <Foundation/Foundation.h>

#import "ios/chrome/common/intents/AddBookmarkToChromeIntent.h"
#import "ios/chrome/common/intents/AddReadingListItemToChromeIntent.h"
#import "ios/chrome/common/intents/ClearBrowsingDataIntent.h"
#import "ios/chrome/common/intents/ManagePasswordsIntent.h"
#import "ios/chrome/common/intents/ManagePaymentMethodsIntent.h"
#import "ios/chrome/common/intents/ManageSettingsIntent.h"
#import "ios/chrome/common/intents/OpenBookmarksIntent.h"
#import "ios/chrome/common/intents/OpenInChromeIncognitoIntent.h"
#import "ios/chrome/common/intents/OpenInChromeIntent.h"
#import "ios/chrome/common/intents/OpenLatestTabIntent.h"
#import "ios/chrome/common/intents/OpenLensIntent.h"
#import "ios/chrome/common/intents/OpenNewIncognitoTabIntent.h"
#import "ios/chrome/common/intents/OpenNewTabIntent.h"
#import "ios/chrome/common/intents/OpenReadingListIntent.h"
#import "ios/chrome/common/intents/OpenRecentTabsIntent.h"
#import "ios/chrome/common/intents/OpenTabGridIntent.h"
#import "ios/chrome/common/intents/PlayDinoGameIntent.h"
#import "ios/chrome/common/intents/RunSafetyCheckIntent.h"
#import "ios/chrome/common/intents/SearchInChromeIntent.h"
#import "ios/chrome/common/intents/SearchWithVoiceIntent.h"
#import "ios/chrome/common/intents/SetChromeDefaultBrowserIntent.h"
#import "ios/chrome/common/intents/ViewHistoryIntent.h"

@interface ChromeIntentsHandler () <AddBookmarkToChromeIntentHandling,
                                    AddReadingListItemToChromeIntentHandling,
                                    ClearBrowsingDataIntentHandling,
                                    ManagePasswordsIntentHandling,
                                    ManagePaymentMethodsIntentHandling,
                                    ManageSettingsIntentHandling,
                                    OpenBookmarksIntentHandling,
                                    OpenInChromeIncognitoIntentHandling,
                                    OpenInChromeIntentHandling,
                                    OpenLatestTabIntentHandling,
                                    OpenLensIntentHandling,
                                    OpenNewIncognitoTabIntentHandling,
                                    OpenNewTabIntentHandling,
                                    OpenReadingListIntentHandling,
                                    OpenRecentTabsIntentHandling,
                                    OpenTabGridIntentHandling,
                                    PlayDinoGameIntentHandling,
                                    RunSafetyCheckIntentHandling,
                                    SearchInChromeIntentHandling,
                                    SearchWithVoiceIntentHandling,
                                    SetChromeDefaultBrowserIntentHandling,
                                    ViewHistoryIntentHandling>
@end

@implementation ChromeIntentsHandler

- (id)handlerForIntent:(INIntent*)intent {
  return self;
}

#pragma mark - AddBookmarkToChromeIntentHandling

- (void)resolveUrlForAddBookmarkToChrome:(AddBookmarkToChromeIntent*)intent
                          withCompletion:
                              (void (^)(NSArray<INURLResolutionResult*>*))
                                  completion {
  NSMutableArray<INURLResolutionResult*>* result =
      [NSMutableArray arrayWithCapacity:intent.url.count];

  for (NSURL* url in intent.url) {
    [result addObject:[INURLResolutionResult successWithResolvedURL:url]];
  }

  completion(result);
}

- (void)handleAddBookmarkToChrome:(AddBookmarkToChromeIntent*)intent
                       completion:(void (^)(AddBookmarkToChromeIntentResponse*))
                                      completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  AddBookmarkToChromeIntentResponse* response =
      [[AddBookmarkToChromeIntentResponse alloc]
          initWithCode:AddBookmarkToChromeIntentResponseCodeContinueInApp
          userActivity:activity];

  completion(response);
}
#pragma mark - AddReadingListItemToChromeIntentHandling

- (void)
    resolveUrlForAddReadingListItemToChrome:
        (AddReadingListItemToChromeIntent*)intent
                             withCompletion:
                                 (void (^)(NSArray<INURLResolutionResult*>*))
                                     completion {
  NSMutableArray<INURLResolutionResult*>* result =
      [NSMutableArray arrayWithCapacity:intent.url.count];

  for (NSURL* url in intent.url) {
    [result addObject:[INURLResolutionResult successWithResolvedURL:url]];
  }

  completion(result);
}

- (void)
    handleAddReadingListItemToChrome:(AddReadingListItemToChromeIntent*)intent
                          completion:
                              (void (^)(
                                  AddReadingListItemToChromeIntentResponse*))
                                  completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  AddReadingListItemToChromeIntentResponse* response =
      [[AddReadingListItemToChromeIntentResponse alloc]
          initWithCode:AddReadingListItemToChromeIntentResponseCodeContinueInApp
          userActivity:activity];

  completion(response);
}

#pragma mark - OpenInChromeIncognitoIntentHandling

- (void)resolveUrlForOpenInChromeIncognito:(OpenInChromeIncognitoIntent*)intent
                            withCompletion:
                                (void (^)(NSArray<INURLResolutionResult*>*))
                                    completion {
  NSMutableArray<INURLResolutionResult*>* result =
      [NSMutableArray arrayWithCapacity:intent.url.count];

  for (NSURL* url in intent.url) {
    [result addObject:[INURLResolutionResult successWithResolvedURL:url]];
  }

  completion(result);
}

- (void)handleOpenInChromeIncognito:(OpenInChromeIncognitoIntent*)intent
                         completion:
                             (void (^)(OpenInChromeIncognitoIntentResponse*))
                                 completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  OpenInChromeIncognitoIntentResponse* response =
      [[OpenInChromeIncognitoIntentResponse alloc]
          initWithCode:OpenInChromeIncognitoIntentResponseCodeContinueInApp
          userActivity:activity];

  completion(response);
}

#pragma mark - OpenInChromeIntentHandling

- (void)resolveUrlForOpenInChrome:(OpenInChromeIntent*)intent
                   withCompletion:
                       (void (^)(NSArray<INURLResolutionResult*>*))completion {
  NSMutableArray<INURLResolutionResult*>* result =
      [NSMutableArray arrayWithCapacity:intent.url.count];

  for (NSURL* url in intent.url) {
    [result addObject:[INURLResolutionResult successWithResolvedURL:url]];
  }

  completion(result);
}

- (void)handleOpenInChrome:(OpenInChromeIntent*)intent
                completion:
                    (void (^)(OpenInChromeIntentResponse* response))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  OpenInChromeIntentResponse* response = [[OpenInChromeIntentResponse alloc]
      initWithCode:OpenInChromeIntentResponseCodeContinueInApp
      userActivity:activity];

  completion(response);
}

#pragma mark - SearchInChromeIntentHandling

- (void)resolveSearchPhraseForSearchInChrome:(SearchInChromeIntent*)intent
                              withCompletion:
                                  (void (^)(INStringResolutionResult*))
                                      completion {
  INStringResolutionResult* result =
      [INStringResolutionResult successWithResolvedString:intent.searchPhrase];

  completion(result);
}

- (void)handleSearchInChrome:(SearchInChromeIntent*)intent
                  completion:
                      (void (^)(SearchInChromeIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  SearchInChromeIntentResponse* response = [[SearchInChromeIntentResponse alloc]
      initWithCode:SearchInChromeIntentResponseCodeContinueInApp
      userActivity:activity];

  completion(response);
}

#pragma mark - OpenReadingListIntentHandling

- (void)handleOpenReadingList:(OpenReadingListIntent*)intent
                   completion:
                       (void (^)(OpenReadingListIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  OpenReadingListIntentResponse* response =
      [[OpenReadingListIntentResponse alloc]
          initWithCode:OpenReadingListIntentResponseCodeContinueInApp
          userActivity:activity];

  completion(response);
}

#pragma mark - OpenBookmarksIntentHandling

- (void)handleOpenBookmarks:(OpenBookmarksIntent*)intent
                 completion:(void (^)(OpenBookmarksIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  OpenBookmarksIntentResponse* response = [[OpenBookmarksIntentResponse alloc]
      initWithCode:OpenBookmarksIntentResponseCodeContinueInApp
      userActivity:activity];

  completion(response);
}

#pragma mark - OpenRecentTabsIntentHandling

- (void)handleOpenRecentTabs:(OpenRecentTabsIntent*)intent
                  completion:
                      (void (^)(OpenRecentTabsIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  OpenRecentTabsIntentResponse* response = [[OpenRecentTabsIntentResponse alloc]
      initWithCode:OpenRecentTabsIntentResponseCodeContinueInApp
      userActivity:activity];

  completion(response);
}

#pragma mark - OpenTabGridIntentHandling

- (void)handleOpenTabGrid:(OpenTabGridIntent*)intent
               completion:(void (^)(OpenTabGridIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  OpenTabGridIntentResponse* response = [[OpenTabGridIntentResponse alloc]
      initWithCode:OpenTabGridIntentResponseCodeContinueInApp
      userActivity:activity];

  completion(response);
}

#pragma mark - SearchWithVoiceIntentHandling

- (void)handleSearchWithVoice:(SearchWithVoiceIntent*)intent
                   completion:
                       (void (^)(SearchWithVoiceIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  SearchWithVoiceIntentResponse* response =
      [[SearchWithVoiceIntentResponse alloc]
          initWithCode:SearchWithVoiceIntentResponseCodeContinueInApp
          userActivity:activity];

  completion(response);
}

#pragma mark OpenNewTabIntentHandling

- (void)handleOpenNewTab:(OpenNewTabIntent*)intent
              completion:(void (^)(OpenNewTabIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  OpenNewTabIntentResponse* response = [[OpenNewTabIntentResponse alloc]
      initWithCode:OpenNewTabIntentResponseCodeContinueInApp
      userActivity:activity];

  completion(response);
}

#pragma mark - PlayDinoGameIntentHandling

- (void)handlePlayDinoGame:(PlayDinoGameIntent*)intent
                completion:(void (^)(PlayDinoGameIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  PlayDinoGameIntentResponse* response = [[PlayDinoGameIntentResponse alloc]
      initWithCode:PlayDinoGameIntentResponseCodeContinueInApp
      userActivity:activity];

  completion(response);
}

#pragma mark - SetChromeDefaultBrowserIntentHandling

- (void)
    handleSetChromeDefaultBrowser:(SetChromeDefaultBrowserIntent*)intent
                       completion:
                           (void (^)(SetChromeDefaultBrowserIntentResponse*))
                               completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  SetChromeDefaultBrowserIntentResponse* response =
      [[SetChromeDefaultBrowserIntentResponse alloc]
          initWithCode:SetChromeDefaultBrowserIntentResponseCodeContinueInApp
          userActivity:activity];

  completion(response);
}

#pragma mark - ViewHistoryIntentHandling

- (void)handleViewHistory:(ViewHistoryIntent*)intent
               completion:(void (^)(ViewHistoryIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  ViewHistoryIntentResponse* response = [[ViewHistoryIntentResponse alloc]
      initWithCode:ViewHistoryIntentResponseCodeContinueInApp
      userActivity:activity];

  completion(response);
}

#pragma mark - OpenNewIncognitoTabIntentHandling

- (void)handleOpenNewIncognito:(OpenNewIncognitoTabIntent*)intent
                    completion:(void (^)(OpenNewIncognitoTabIntentResponse*))
                                   completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  OpenNewIncognitoTabIntentResponse* response =
      [[OpenNewIncognitoTabIntentResponse alloc]
          initWithCode:OpenNewIncognitoTabIntentResponseCodeContinueInApp
          userActivity:activity];

  completion(response);
}

#pragma mark - ManagePaymentMethodsIntentHandling

- (void)handleManagePaymentMethods:(ManagePaymentMethodsIntent*)intent
                        completion:
                            (void (^)(ManagePaymentMethodsIntentResponse*))
                                completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  ManagePaymentMethodsIntentResponse* response =
      [[ManagePaymentMethodsIntentResponse alloc]
          initWithCode:ManagePaymentMethodsIntentResponseCodeContinueInApp
          userActivity:activity];

  completion(response);
}

#pragma mark - RunSafetyCheckIntentHandling

- (void)handleRunSafetyCheck:(RunSafetyCheckIntent*)intent
                  completion:
                      (void (^)(RunSafetyCheckIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  RunSafetyCheckIntentResponse* response = [[RunSafetyCheckIntentResponse alloc]
      initWithCode:RunSafetyCheckIntentResponseCodeContinueInApp
      userActivity:activity];

  completion(response);
}

#pragma mark - ManagePasswordsIntentHandling

- (void)handleManagePasswords:(ManagePasswordsIntent*)intent
                   completion:
                       (void (^)(ManagePasswordsIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  ManagePasswordsIntentResponse* response =
      [[ManagePasswordsIntentResponse alloc]
          initWithCode:ManagePasswordsIntentResponseCodeContinueInApp
          userActivity:activity];

  completion(response);
}

#pragma mark - ManageSettingsIntentHandling

- (void)handleManageSettings:(ManageSettingsIntent*)intent
                  completion:
                      (void (^)(ManageSettingsIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  ManageSettingsIntentResponse* response = [[ManageSettingsIntentResponse alloc]
      initWithCode:ManageSettingsIntentResponseCodeContinueInApp
      userActivity:activity];

  completion(response);
}

#pragma mark - OpenLatestTabIntentHandling

- (void)handleOpenLatestTab:(OpenLatestTabIntent*)intent
                 completion:(void (^)(OpenLatestTabIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  OpenLatestTabIntentResponse* response = [[OpenLatestTabIntentResponse alloc]
      initWithCode:OpenLatestTabIntentResponseCodeContinueInApp
      userActivity:activity];

  completion(response);
}

#pragma mark - OpenLensIntentHandling

- (void)handleOpenLens:(OpenLensIntent*)intent
            completion:(void (^)(OpenLensIntentResponse*))completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  OpenLensIntentResponse* response = [[OpenLensIntentResponse alloc]
      initWithCode:OpenLensIntentResponseCodeContinueInApp
      userActivity:activity];

  completion(response);
}

#pragma mark - ClearBrowsingDataIntentHandling

- (void)handleClearBrowsingData:(ClearBrowsingDataIntent*)intent
                     completion:(void (^)(ClearBrowsingDataIntentResponse*))
                                    completion {
  NSUserActivity* activity = [[NSUserActivity alloc]
      initWithActivityType:NSStringFromClass([intent class])];

  ClearBrowsingDataIntentResponse* response =
      [[ClearBrowsingDataIntentResponse alloc]
          initWithCode:ClearBrowsingDataIntentResponseCodeContinueInApp
          userActivity:activity];

  completion(response);
}

@end
