// Copyright 2016-present the Material Components for iOS authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#import "MDCAppBarContainerViewController.h"

#import "MDCAppBarViewController.h"
#import "MaterialFlexibleHeader.h"
#import "MaterialNavigationBar.h"

@interface MDCAppBarContainerViewController ()

// To be deprecated APIs; re-declared here in order to be auto-synthesized.
@property(nonatomic, getter=isTopLayoutGuideAdjustmentEnabled) BOOL topLayoutGuideAdjustmentEnabled;
@property(nonatomic, strong, nonnull, readonly) MDCAppBar *appBar;

@end

@implementation MDCAppBarContainerViewController

- (instancetype)initWithContentViewController:(UIViewController *)contentViewController {
  self = [super initWithNibName:nil bundle:nil];
  if (self) {
    _appBar = [[MDCAppBar alloc] init];

    [self addChildViewController:_appBar.appBarViewController];

    _contentViewController = contentViewController;
    [self addChildViewController:contentViewController];
  }
  return self;
}

- (void)viewDidLoad {
  [super viewDidLoad];

  [self.view addSubview:self.contentViewController.view];
  [self.contentViewController didMoveToParentViewController:self];

  [_appBar addSubviewsToParent];

  [_appBar.navigationBar observeNavigationItem:_contentViewController.navigationItem];

  [self updateTopLayoutGuideBehavior];
}

- (void)viewWillLayoutSubviews {
  [super viewWillLayoutSubviews];

  if (!self.topLayoutGuideAdjustmentEnabled) {
    [_appBar.appBarViewController updateTopLayoutGuide];
  }
}

- (BOOL)prefersStatusBarHidden {
  return self.appBar.appBarViewController.prefersStatusBarHidden;
}

- (UIStatusBarStyle)preferredStatusBarStyle {
  return self.appBar.appBarViewController.preferredStatusBarStyle;
}

- (BOOL)shouldAutorotate {
  return self.contentViewController.shouldAutorotate;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
  return self.contentViewController.supportedInterfaceOrientations;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
  return self.contentViewController.preferredInterfaceOrientationForPresentation;
}

- (MDCAppBarViewController *)appBarViewController {
  return _appBar.appBarViewController;
}

#pragma mark - Enabling top layout guide adjustment behavior

- (void)updateTopLayoutGuideBehavior {
  if (self.topLayoutGuideAdjustmentEnabled) {
    if ([self isViewLoaded]) {
      self.contentViewController.view.translatesAutoresizingMaskIntoConstraints = YES;
      self.contentViewController.view.autoresizingMask =
          (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
      self.contentViewController.view.frame = self.view.bounds;
    }

    // The flexible header view controller, by default, will assume that it is a child view
    // controller of the content view controller and modify its parent view controller's
    // topLayoutGuide. With an App Bar container view controller, however, our flexible header's
    // parent is the app bar container view controller instead. There does not appear to be a way to
    // make two top layout guides constrain to one other
    // (e.g. self.topLayoutGuide == self.contentViewController.topLayoutGuide) so instead we must
    // tell the flexible header controller which view controller it should modify.
    self.appBar.appBarViewController.topLayoutGuideViewController = self.contentViewController;

  } else {
    self.appBar.appBarViewController.topLayoutGuideViewController = nil;
  }
}

- (void)setTopLayoutGuideAdjustmentEnabled:(BOOL)topLayoutGuideAdjustmentEnabled {
  if (_topLayoutGuideAdjustmentEnabled == topLayoutGuideAdjustmentEnabled) {
    return;
  }
  _topLayoutGuideAdjustmentEnabled = topLayoutGuideAdjustmentEnabled;

  [self updateTopLayoutGuideBehavior];
}

@end
