// Copyright 2013 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/bookmarks/bookmark_sync_promo_controller.h"

#include "base/strings/sys_string_conversions.h"
#include "chrome/browser/signin/signin_promo.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/chrome_style.h"
#import "chrome/browser/ui/cocoa/hyperlink_text_view.h"
#include "grit/generated_resources.h"
#include "skia/ext/skia_utils_mac.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/l10n/l10n_util_mac.h"

namespace {

// Remove underlining from the specified range of characters in a text view.
void RemoveUnderlining(NSTextView* textView, int offset, int length) {
  [textView setLinkTextAttributes:nil];
  NSTextStorage* text = [textView textStorage];
  NSRange range = NSMakeRange(offset, length);
  [text addAttribute:NSUnderlineStyleAttributeName
               value:[NSNumber numberWithInt:NSUnderlineStyleNone]
               range:range];
}

const SkColor kTextColor = SkColorSetRGB(0x66, 0x66, 0x66);
const SkColor kBackgroundColor = SkColorSetRGB(0xf5, 0xf5, 0xf5);
const SkColor kBorderColor = SkColorSetRGB(0xe5, 0xe5, 0xe5);

// Vertical padding of the promo (dp).
const CGFloat kVerticalPadding = 15;

// Width of the border (dp).
const CGFloat kBorderWidth = 1.0;

// Font size of the promo text (pt).
const int kFontSize = 11;

}  // namespace

@implementation BookmarkSyncPromoController

- (id)initWithBrowser:(Browser*)browser {
  if ((self = [super init])) {
    browser_ = browser;
  }
  return self;
}

- (CGFloat)borderWidth {
  return kBorderWidth;
}

- (CGFloat)preferredHeightForWidth:(CGFloat)width {
  CGFloat availableWidth =
      width - (2 * chrome_style::kHorizontalPadding) - (2 * kBorderWidth);
  NSRect frame = [[textView_ textStorage]
      boundingRectWithSize:NSMakeSize(availableWidth, 0.0)
                   options:NSStringDrawingUsesLineFragmentOrigin];
  return frame.size.height + (2 * kVerticalPadding) + (2 * kBorderWidth);
}

- (void)loadView {
  NSBox* promoView = [[[NSBox alloc] init] autorelease];
  [promoView setBoxType:NSBoxCustom];
  [promoView setFillColor:gfx::SkColorToDeviceNSColor(kBackgroundColor)];
  [promoView setContentViewMargins:NSMakeSize(chrome_style::kHorizontalPadding,
                                              kVerticalPadding)];
  [promoView setBorderType:NSLineBorder];
  [promoView setBorderWidth:kBorderWidth];
  [promoView setBorderColor:gfx::SkColorToDeviceNSColor(kBorderColor)];

  // Add the sync promo text.
  size_t offset;
  const string16 linkText = l10n_util::GetStringUTF16(
      IDS_BOOKMARK_SYNC_PROMO_LINK);
  const string16 promoText =  l10n_util::GetStringFUTF16(
      IDS_BOOKMARK_SYNC_PROMO_MESSAGE,
      linkText, &offset);
  const string16 promoTextWithoutLink =
      promoText.substr(0, offset) +
      promoText.substr(offset + linkText.size());

  NSFont* font = [NSFont labelFontOfSize:kFontSize];
  NSColor* linkColor = gfx::SkColorToCalibratedNSColor(
      chrome_style::GetLinkColor());

  textView_.reset([[HyperlinkTextView alloc] init]);
  [textView_ setMessageAndLink:base::SysUTF16ToNSString(promoTextWithoutLink)
                      withLink:base::SysUTF16ToNSString(linkText)
                      atOffset:offset
                          font:font
                  messageColor:gfx::SkColorToDeviceNSColor(kTextColor)
                     linkColor:linkColor];
  [textView_ setAcceptsFirstResponder:NO];
  [[textView_ textContainer] setLineFragmentPadding:0.0];
  RemoveUnderlining(textView_, offset, linkText.size());
  [textView_ setDelegate:self];

  [promoView setContentView:textView_];

  [self setView:promoView];
}

- (BOOL)textView:(NSTextView *)textView
   clickedOnLink:(id)link
         atIndex:(NSUInteger)charIndex {
  chrome::ShowBrowserSignin(browser_, signin::SOURCE_BOOKMARK_BUBBLE);
  return YES;
}

@end
