// Copyright 2018 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/chrome/browser/ui/popup_menu/cells/popup_menu_navigation_item.h"

#include "base/logging.h"
#import "ios/chrome/browser/ui/popup_menu/public/popup_menu_ui_constants.h"
#import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
#import "ios/chrome/common/ui_util/constraints_ui_util.h"

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

namespace {
const CGFloat kImageSize = 16;
const CGFloat kImageCornerRadius = 2;
const CGFloat kFaviconBackgroundSize = 28;
const CGFloat kFaviconBackgroundColorAlpha = 0.03;
const CGFloat kFaviconBackgroundCornerRadius = 7;
const CGFloat kCellHeight = 44;
const CGFloat kIconTextMargin = 11;
const CGFloat kMargin = 15;
const CGFloat kVerticalMargin = 8;
const CGFloat kMaxHeight = 100;
}  // namespace

@implementation PopupMenuNavigationItem

@synthesize actionIdentifier = _actionIdentifier;
@synthesize favicon = _favicon;
@synthesize title = _title;
@synthesize navigationItem = _navigationItem;

- (instancetype)initWithType:(NSInteger)type {
  self = [super initWithType:type];
  if (self) {
    self.cellClass = [PopupMenuNavigationCell class];
  }
  return self;
}

- (void)configureCell:(PopupMenuNavigationCell*)cell
           withStyler:(ChromeTableViewStyler*)styler {
  [super configureCell:cell withStyler:styler];
  cell.accessibilityTraits = UIAccessibilityTraitButton;
  [cell setFavicon:self.favicon];
  [cell setTitle:self.title];
}

#pragma mark - PopupMenuItem

- (CGSize)cellSizeForWidth:(CGFloat)width {
  // TODO(crbug.com/828357): This should be done at the table view level.
  static PopupMenuNavigationCell* cell;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    cell = [[PopupMenuNavigationCell alloc] init];
    [cell registerForContentSizeUpdates];
  });

  [self configureCell:cell withStyler:[[ChromeTableViewStyler alloc] init]];
  cell.frame = CGRectMake(0, 0, width, kMaxHeight);
  [cell setNeedsLayout];
  [cell layoutIfNeeded];
  return [cell systemLayoutSizeFittingSize:CGSizeMake(width, kMaxHeight)];
}

@end

#pragma mark - PopupMenuNavigationCell

@interface PopupMenuNavigationCell ()
@property(nonatomic, strong) UILabel* titleLabel;
@property(nonatomic, strong) UIImageView* faviconImageView;
@end

@implementation PopupMenuNavigationCell

@synthesize faviconImageView = _faviconImageView;
@synthesize titleLabel = _titleLabel;

- (instancetype)initWithStyle:(UITableViewCellStyle)style
              reuseIdentifier:(NSString*)reuseIdentifier {
  self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
  if (self) {
    UIView* selectedBackgroundView = [[UIView alloc] init];
    selectedBackgroundView.backgroundColor =
        [UIColor colorWithWhite:0 alpha:kSelectedItemBackgroundAlpha];
    self.selectedBackgroundView = selectedBackgroundView;

    _titleLabel = [[UILabel alloc] init];
    _titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
    _titleLabel.font = [self titleFont];
    _titleLabel.adjustsFontForContentSizeCategory = YES;

    UIView* faviconBackground = [[UIView alloc] init];
    faviconBackground.translatesAutoresizingMaskIntoConstraints = NO;
    faviconBackground.backgroundColor =
        [UIColor colorWithWhite:0 alpha:kFaviconBackgroundColorAlpha];
    faviconBackground.layer.cornerRadius = kFaviconBackgroundCornerRadius;

    _faviconImageView = [[UIImageView alloc] init];
    _faviconImageView.translatesAutoresizingMaskIntoConstraints = NO;
    _faviconImageView.layer.cornerRadius = kImageCornerRadius;
    _faviconImageView.layer.masksToBounds = YES;

    [faviconBackground addSubview:_faviconImageView];

    [self.contentView addSubview:_titleLabel];
    [self.contentView addSubview:faviconBackground];

    ApplyVisualConstraintsWithMetrics(
        @[
          @"H:|-(margin)-[favicon(faviconSize)]-(iconText)-[text]-(margin)-|",
          @"H:[image(imageSize)]", @"V:[favicon(faviconSize)]",
          @"V:[image(imageSize)]",
          @"V:|-(verticalMargin)-[text]-(verticalMargin)-|"
        ],
        @{
          @"image" : _faviconImageView,
          @"text" : _titleLabel,
          @"favicon" : faviconBackground
        },
        @{
          @"margin" : @(kMargin),
          @"imageSize" : @(kImageSize),
          @"faviconSize" : @(kFaviconBackgroundSize),
          @"iconText" : @(kIconTextMargin),
          @"verticalMargin" : @(kVerticalMargin),
        });

    [self.contentView.heightAnchor
        constraintGreaterThanOrEqualToConstant:kCellHeight]
        .active = YES;
    AddSameCenterConstraints(_faviconImageView, faviconBackground);
    AddSameCenterYConstraint(self.contentView, faviconBackground);

    self.isAccessibilityElement = YES;
  }
  return self;
}

- (void)setTitle:(NSString*)title {
  self.titleLabel.text = title;
}

- (void)setFavicon:(UIImage*)favicon {
  if (favicon) {
    self.faviconImageView.image = favicon;
  } else {
    self.faviconImageView.image = [UIImage imageNamed:@"default_favicon"];
  }
}

- (void)registerForContentSizeUpdates {
  // This is needed because if the cell is static (used for height),
  // adjustsFontForContentSizeCategory isn't working.
  [[NSNotificationCenter defaultCenter]
      addObserver:self
         selector:@selector(preferredContentSizeDidChange:)
             name:UIContentSizeCategoryDidChangeNotification
           object:nil];
}

- (void)prepareForReuse {
  [super prepareForReuse];
  [self setFavicon:nil];
}

#pragma mark - Private

// Callback when the preferred Content Size change.
- (void)preferredContentSizeDidChange:(NSNotification*)notification {
  self.titleLabel.font = [self titleFont];
}

// Font to be used for the title.
- (UIFont*)titleFont {
  return [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
}

@end
