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

#include "ios/chrome/browser/ui/tab_switcher/tab_switcher_transition_context.h"

#import "ios/chrome/browser/tabs/tab.h"
#import "ios/chrome/browser/ui/browser_view_controller.h"
#include "ios/chrome/browser/ui/tab_switcher/tab_switcher_transition_context.h"
#import "ios/chrome/browser/ui/tabs/tab_strip_controller+tab_switcher_animation.h"
#import "ios/chrome/browser/ui/tabs/tab_strip_controller.h"
#import "ios/chrome/browser/ui/uikit_ui_util.h"

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

@class BrowserViewController;

@interface TabSwitcherTransitionContextContent () {
  TabSwitcherTabStripPlaceholderView* _tabStripPlaceholderView;
  __weak BrowserViewController* _bvc;
}

@end

@implementation TabSwitcherTransitionContextContent {
}

+ (instancetype)tabSwitcherTransitionContextContentFromBVC:
    (BrowserViewController*)bvc {
  TabSwitcherTransitionContextContent* transitionContextContent =
      [[TabSwitcherTransitionContextContent alloc] init];

  transitionContextContent.initialTabID = bvc.tabModel.currentTab.tabId;

  if (![bvc isViewLoaded]) {
    [bvc ensureViewCreated];
    [bvc.view setFrame:[[UIScreen mainScreen] bounds]];
  }

  UIView* toolbarView = [[bvc toolbarController] view];
  UIView* toolbarSnapshotView;
  if ([toolbarView window]) {
    toolbarSnapshotView = [toolbarView snapshotViewAfterScreenUpdates:NO];
  } else {
    toolbarSnapshotView = [[UIView alloc] initWithFrame:toolbarView.frame];
    [toolbarSnapshotView layer].contents = static_cast<id>(
        CaptureViewWithOption(toolbarView, 1, kClientSideRendering).CGImage);
  }
  transitionContextContent.toolbarSnapshotView = toolbarSnapshotView;
  transitionContextContent->_bvc = bvc;
  return transitionContextContent;
}

- (TabSwitcherTabStripPlaceholderView*)generateTabStripPlaceholderView {
  TabStripController* tsc = [_bvc tabStripController];
  return [tsc placeholderView];
}

@synthesize toolbarSnapshotView = _toolbarSnapshotView;
@synthesize initialTabID = _initialTabID;

- (instancetype)init {
  self = [super init];
  if (self) {
  }
  return self;
}

@end

@implementation TabSwitcherTransitionContext {
}

+ (instancetype)
tabSwitcherTransitionContextWithCurrent:(BrowserViewController*)currentBVC
                                mainBVC:(BrowserViewController*)mainBVC
                                 otrBVC:(BrowserViewController*)otrBVC {
  TabSwitcherTransitionContext* transitionContext =
      [[TabSwitcherTransitionContext alloc] init];
  Tab* currentTab = [[currentBVC tabModel] currentTab];
  UIImage* tabSnapshotImage =
      [currentTab generateSnapshotWithOverlay:YES visibleFrameOnly:YES];
  [transitionContext setTabSnapshotImage:tabSnapshotImage];
  [transitionContext
      setIncognitoContent:
          [TabSwitcherTransitionContextContent
              tabSwitcherTransitionContextContentFromBVC:otrBVC]];
  [transitionContext
      setRegularContent:
          [TabSwitcherTransitionContextContent
              tabSwitcherTransitionContextContentFromBVC:mainBVC]];
  [transitionContext setInitialTabModel:currentBVC.tabModel];
  return transitionContext;
}

@synthesize tabSnapshotImage = _tabSnapshotImage;
@synthesize incognitoContent = _incognitoContent;
@synthesize regularContent = _regularContent;
@synthesize initialTabModel = _initialTabModel;

- (instancetype)init {
  self = [super init];
  if (self) {
  }
  return self;
}

@end
