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

#import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.h"

#include "base/feature_list.h"
#import "components/image_fetcher/ios/ios_image_data_fetcher_wrapper.h"
#include "components/omnibox/browser/autocomplete_result.h"
#include "components/omnibox/browser/omnibox_field_trial.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
#import "ios/chrome/browser/ui/ntp/ntp_util.h"
#import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.h"
#import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_presenter.h"
#import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.h"
#include "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_ios.h"
#include "ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_coordinator.h"
#include "ios/chrome/browser/ui/ui_util.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"

#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif

@interface OmniboxPopupCoordinator () {
  std::unique_ptr<OmniboxPopupViewIOS> _popupView;
}

@property(nonatomic, strong) OmniboxPopupViewController* popupViewController;
@property(nonatomic, strong) OmniboxPopupMediator* mediator;
@property(nonatomic, strong) ShortcutsCoordinator* shortcutsCoordinator;

@end

@implementation OmniboxPopupCoordinator

@synthesize browserState = _browserState;
@synthesize mediator = _mediator;
@synthesize popupViewController = _popupViewController;
@synthesize positioner = _positioner;
@synthesize dispatcher = _dispatcher;

#pragma mark - Public

- (instancetype)initWithPopupView:
    (std::unique_ptr<OmniboxPopupViewIOS>)popupView {
  self = [super init];
  if (self) {
    _popupView = std::move(popupView);
  }
  return self;
}

- (void)start {
  std::unique_ptr<image_fetcher::IOSImageDataFetcherWrapper> imageFetcher =
      std::make_unique<image_fetcher::IOSImageDataFetcherWrapper>(
          self.browserState->GetSharedURLLoaderFactory());

  self.mediator =
      [[OmniboxPopupMediator alloc] initWithFetcher:std::move(imageFetcher)
                                           delegate:_popupView.get()];
  self.mediator.dispatcher = (id<BrowserCommands>)self.dispatcher;
  self.popupViewController = [[OmniboxPopupViewController alloc] init];
  self.popupViewController.incognito = self.browserState->IsOffTheRecord();

  BOOL isIncognito = self.browserState->IsOffTheRecord();
  self.mediator.incognito = isIncognito;
  self.mediator.consumer = self.popupViewController;
    self.mediator.presenter = [[OmniboxPopupPresenter alloc]
        initWithPopupPositioner:self.positioner
            popupViewController:self.popupViewController
                      incognito:isIncognito];
  self.popupViewController.imageRetriever = self.mediator;
  self.popupViewController.delegate = self.mediator;
  [self.dispatcher
      startDispatchingToTarget:self.popupViewController
                   forProtocol:@protocol(OmniboxSuggestionCommands)];

  _popupView->SetMediator(self.mediator);

  if (base::FeatureList::IsEnabled(
          omnibox::kOmniboxPopupShortcutIconsInZeroState)) {
    self.shortcutsCoordinator = [[ShortcutsCoordinator alloc]
        initWithBaseViewController:self.popupViewController
                      browserState:self.browserState];
    [self.shortcutsCoordinator start];
    self.popupViewController.shortcutsViewController =
        self.shortcutsCoordinator.viewController;
  }
}

- (void)stop {
  [self.shortcutsCoordinator stop];
  _popupView.reset();
  [self.dispatcher
      stopDispatchingForProtocol:@protocol(OmniboxSuggestionCommands)];
}

- (BOOL)isOpen {
  return self.mediator.isOpen;
}

- (void)openPopup {
  // Show shortcuts when the feature is enabled. Don't show them on NTP as they
  // are already part of the NTP.
  if (!IsVisibleUrlNewTabPage(self.webStateList->GetActiveWebState()) &&
      base::FeatureList::IsEnabled(
          omnibox::kOmniboxPopupShortcutIconsInZeroState)) {
    self.popupViewController.shortcutsEnabled = YES;
  }

  [self.mediator.presenter updateHeightAndAnimateAppearanceIfNecessary];
  self.mediator.open = YES;
}

- (void)closePopup {
  self.mediator.open = NO;
  self.popupViewController.shortcutsEnabled = NO;
  [self.mediator.presenter animateCollapse];
}

#pragma mark - Property accessor

- (BOOL)hasResults {
  return self.mediator.hasResults;
}

@end
