// 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/showcase/bubble/sc_bubble_coordinator.h"

#include "ios/chrome/browser/ui/bubble/bubble_util.h"
#import "ios/chrome/browser/ui/bubble/bubble_view_controller.h"

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

@interface SCBubbleCoordinator ()
@property(nonatomic, strong) UIViewController* containerViewController;
@property(nonatomic, strong) BubbleViewController* bubbleViewController;
@end

@implementation SCBubbleCoordinator
@synthesize baseViewController = _baseViewController;
@synthesize containerViewController = _containerViewController;
@synthesize bubbleViewController = _bubbleViewController;

- (void)start {
  self.containerViewController = [[UIViewController alloc] init];
  UIView* containerView = self.containerViewController.view;
  containerView.backgroundColor = [UIColor whiteColor];
  self.containerViewController.title = @"Bubble";

  BubbleArrowDirection direction = BubbleArrowDirectionUp;
  BubbleAlignment alignment = BubbleAlignmentTrailing;
  self.bubbleViewController =
      [[BubbleViewController alloc] initWithText:@"Lorem ipsum dolor"
                                  arrowDirection:direction
                                       alignment:alignment];

  // Mock UI element for the bubble to be anchored on. Set the x-coordinate of
  // the origin to be two-thirds of the container's width.
  UIView* elementView = [[UIView alloc]
      initWithFrame:CGRectMake(containerView.frame.size.width * 2.0f / 3.0f,
                               20.0f, 20.0f, 20.0f)];
  elementView.backgroundColor = [UIColor grayColor];
  [containerView addSubview:elementView];
  CGPoint anchorPoint = bubble_util::AnchorPoint(elementView.frame, direction);
  // Maximum width of the bubble such that it stays within |containerView|.
  CGSize maxBubbleSize = bubble_util::BubbleMaxSize(
      anchorPoint, direction, alignment, containerView.frame.size);

  CGSize bubbleSize =
      [self.bubbleViewController.view sizeThatFits:maxBubbleSize];
  CGRect bubbleFrame =
      bubble_util::BubbleFrame(anchorPoint, bubbleSize, direction, alignment,
                               containerView.frame.size.width);

  [self addBubbleViewControllerWithFrame:bubbleFrame];
  [self.baseViewController pushViewController:self.containerViewController
                                     animated:YES];
}

#pragma mark - Private methods

// Add |bubbleViewController| as a child view controller of the container and
// set its frame.
- (void)addBubbleViewControllerWithFrame:(CGRect)bubbleFrame {
  [self.containerViewController
      addChildViewController:self.bubbleViewController];
  self.bubbleViewController.view.frame = bubbleFrame;
  [self.containerViewController.view addSubview:self.bubbleViewController.view];
  [self.bubbleViewController
      didMoveToParentViewController:self.containerViewController];
  [self.bubbleViewController animateContentIn];
}

@end
