// Copyright (c) 2012 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 "chrome/browser/ui/cocoa/one_click_signin_bubble_controller.h"

#include "base/strings/sys_string_conversions.h"
#import "chrome/browser/ui/cocoa/browser_window_controller.h"
#import "chrome/browser/ui/cocoa/info_bubble_window.h"
#import "chrome/browser/ui/cocoa/one_click_signin_view_controller.h"
#import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"

namespace {

void PerformClose(OneClickSigninBubbleController* controller) {
  [controller close];
}

}  // namespace

@implementation OneClickSigninBubbleController

- (id)initWithBrowserWindowController:(BrowserWindowController*)controller
                          webContents:(content::WebContents*)webContents
                         errorMessage:(NSString*)errorMessage
                             callback:(const BrowserWindow::StartSyncCallback&)
                                                                  syncCallback{
  viewController_.reset([[OneClickSigninViewController alloc]
      initWithNibName:@"OneClickSigninBubble"
          webContents:webContents
         syncCallback:syncCallback
        closeCallback:base::Bind(PerformClose, self)
         isSyncDialog:NO
                email:string16()
         errorMessage:errorMessage]);

  NSWindow* parentWindow = [controller window];

  // Set the anchor point to right below the wrench menu.
  NSView* wrenchButton = [[controller toolbarController] wrenchButton];
  const NSRect bounds = [wrenchButton bounds];
  NSPoint anchorPoint = NSMakePoint(NSMidX(bounds), NSMaxY(bounds));
  anchorPoint = [wrenchButton convertPoint:anchorPoint toView:nil];
  anchorPoint = [parentWindow convertBaseToScreen:anchorPoint];

  // Create an empty window into which content is placed.
  NSRect viewBounds = [[viewController_ view] bounds];
  base::scoped_nsobject<InfoBubbleWindow> window(
      [[InfoBubbleWindow alloc] initWithContentRect:viewBounds
                                          styleMask:NSBorderlessWindowMask
                                            backing:NSBackingStoreBuffered
                                              defer:NO]);
  if (self = [super initWithWindow:window
                      parentWindow:parentWindow
                        anchoredAt:anchorPoint]) {
    [[window contentView] addSubview:[viewController_ view]];
    // This class will release itself when the bubble closes. See
    // -[BaseBubbleController windowWillClose:].
    [self retain];
  }

  return self;
}

- (OneClickSigninViewController*)viewController {
  return viewController_;
}

- (void)windowWillClose:(NSNotification*)notification {
  [viewController_ viewWillClose];
  [super windowWillClose:notification];
}

@end  // OneClickSigninBubbleController
