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

#import "GoogleMapsDemos/Samples/SnapshotReadyViewController.h"

#import <GoogleMaps/GoogleMaps.h>

@interface SnapshotReadyViewController ()<GMSMapViewDelegate>
@end

@implementation SnapshotReadyViewController {
  GMSMapView *_mapView;
  UILabel *_statusLabel;
  UIBarButtonItem *_waitButton;
  BOOL _isAwaitingSnapshot;
}

- (void)viewDidLoad {
  [super viewDidLoad];
  GMSCameraPosition *camera =
      [GMSCameraPosition cameraWithLatitude:-33.868 longitude:151.2086 zoom:6];
  _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
  _mapView.delegate = self;
  self.view = _mapView;

  // Add status label, initially hidden.
  _statusLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 30)];
  _statusLabel.alpha = 0.0f;
  _statusLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth;
  _statusLabel.backgroundColor = [UIColor blueColor];
  _statusLabel.textColor = [UIColor whiteColor];
  _statusLabel.textAlignment = NSTextAlignmentCenter;

  // Add a wait button to signify on the next SnapshotReady event, a screenshot of the map will
  // be taken.
  _waitButton = [[UIBarButtonItem alloc] initWithTitle:@"Wait for snapshot"
                                                 style:UIBarButtonItemStylePlain
                                                target:self
                                                action:@selector(didTapWait)];
  self.navigationItem.rightBarButtonItems = @[ _waitButton ];
  [_mapView addSubview:_statusLabel];
}

#pragma mark GMSMapViewDelegate

- (void)mapViewSnapshotReady:(GMSMapView *)mapView {
  if (_isAwaitingSnapshot) {
    _isAwaitingSnapshot = NO;
    _waitButton.enabled = YES;
    _waitButton.title = @"Wait for snapshot";
    [self takeSnapshot];
  }

  _statusLabel.alpha = 0.8f;
  _statusLabel.text = @"Snapshot Ready";
  // Remove status label after 1 second.
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC),
                 dispatch_get_main_queue(), ^{
                   _statusLabel.alpha = 0.0f;
                 });
}

#pragma mark Private

- (void)didTapWait {
  _isAwaitingSnapshot = YES;
  _waitButton.enabled = NO;
  _waitButton.title = @"Waiting";
}

- (void)takeSnapshot {
  // Take a snapshot of the map.
  UIGraphicsBeginImageContextWithOptions(_mapView.bounds.size, YES, 0);
  [_mapView drawViewHierarchyInRect:_mapView.bounds afterScreenUpdates:YES];
  UIImage *mapSnapShot = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  // Put snapshot image into an UIImageView and overlay on top of map.
  UIImageView *imageView = [[UIImageView alloc] initWithImage:mapSnapShot];
  imageView.layer.borderColor = [UIColor redColor].CGColor;
  imageView.layer.borderWidth = 10.0f;
  [_mapView addSubview:imageView];

  // Remove imageView after 1 second.
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [UIView animateWithDuration:1
        animations:^{
          imageView.alpha = 0.0f;
        }
        completion:^(BOOL finished) {
          [imageView removeFromSuperview];
        }];
  });
}

@end
