// 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/clean/chrome/app/steps/root_coordinator+application_step.h"

#include "base/memory/ptr_util.h"
#import "base/supports_user_data.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/web_state_list/web_state_list.h"
#import "ios/clean/chrome/app/application_state.h"
#import "ios/shared/chrome/browser/ui/browser_list/browser.h"
#import "ios/shared/chrome/browser/ui/browser_list/browser_list.h"
#import "ios/shared/chrome/browser/ui/coordinators/browser_coordinator+internal.h"
#import "ios/web/public/navigation_manager.h"
#include "ios/web/public/web_state/web_state.h"

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

namespace {
// SupportsUserData storage container for a BrowserCoordinator object, which
// keeps a strong reference to the object it is initialized with.
class RootCoordinatorContainer : public base::SupportsUserData::Data {
 public:
  explicit RootCoordinatorContainer(BrowserCoordinator* coordinator)
      : coordinator_(coordinator) {}

 private:
  // Mark this variable unused to avoid a compiler warning; the compiler
  // doesn't have visibility into the ARC-injected retain/release.
  BrowserCoordinator* __attribute__((unused)) coordinator_;
};

const char kRootCoordinatorContainerKey[] = "root_coordinator";
}  // namespace

@interface StopRootCoordinator : NSObject<ApplicationStep>
@end

@implementation RootCoordinator (ApplicationStep)

- (BOOL)canRunInState:(ApplicationState*)state {
  return [state.window isKeyWindow] && state.phase == APPLICATION_FOREGROUNDED;
}

- (void)runInState:(ApplicationState*)state {
  self.browser =
      BrowserList::FromBrowserState(state.browserState)->CreateNewBrowser();

  // PLACEHOLDER: Create some open, empty web states.
  WebStateList& webStateList = self.browser->web_state_list();
  for (int i = 0; i < 7; i++) {
    web::WebState::CreateParams webStateCreateParams(
        self.browser->browser_state());
    std::unique_ptr<web::WebState> webState =
        web::WebState::Create(webStateCreateParams);
    webStateList.InsertWebState(0, std::move(webState));
  }
  webStateList.ActivateWebStateAt(0);

  [self start];

  state.window.rootViewController = self.viewController;

  // Size the main view controller to fit the whole screen.
  [self.viewController.view setFrame:state.window.bounds];

  // Tell the application state to use this object to open URLs.
  state.URLOpener = self;

  // Show the window.
  state.window.hidden = NO;

  // Make sure this object stays alive.
  state.persistentState->SetUserData(
      kRootCoordinatorContainerKey,
      base::MakeUnique<RootCoordinatorContainer>(self));

  // Add a termination step to remove this object.
  [[state terminationSteps] addObject:[[StopRootCoordinator alloc] init]];
}

@end

@implementation StopRootCoordinator

- (BOOL)canRunInState:(ApplicationState*)state {
  return state.phase = APPLICATION_TERMINATING;
}

- (void)runInState:(ApplicationState*)state {
  state.persistentState->RemoveUserData(kRootCoordinatorContainerKey);
}

@end
