//
//  RCTAppNexusVideoBannerView.m
//  mirko
//
//  Created by Taras Galagodza on 4/14/19.
//  Copyright © 2019 Facebook. All rights reserved.
//

#import "RCTAppNexusVideoBannerView.h"

typedef NS_ENUM(NSInteger, ANInstreamVideoEventType)
{
  ANInstreamVideoEventAdWasClicked            = -1,
  ANInstreamVideoEventAdClose                 = 0,
  ANInstreamVideoEventDidPresent              = 1
};

@implementation RCTAppNexusVideoBannerView
{
  ANInstreamVideoAd *_bannerView;
}

- (void)didSetProps:(NSArray<NSString *> *)changedProps
{
  BOOL reloadAdView = NO;
  
  if ([changedProps containsObject:@"placementId"]) {
    [self recreateAdView: _placementId];
    reloadAdView = YES;
  }
    
  if (reloadAdView) {
    [_bannerView loadAdWithDelegate:self];
  }
}
  
- (void)recreateAdView:(NSString *)placementId
{
  if (_bannerView) {
    [_bannerView removeFromSuperview];
  }
  
  _bannerView = [[ANInstreamVideoAd alloc] initWithPlacementId:_placementId];
  _bannerView.translatesAutoresizingMaskIntoConstraints = NO;
  [self addSubview:_bannerView];
  
  [_bannerView.leftAnchor constraintEqualToAnchor:self.leftAnchor].active = YES;
  [_bannerView.rightAnchor constraintEqualToAnchor:self.rightAnchor].active = YES;
  [_bannerView.topAnchor constraintEqualToAnchor:self.topAnchor].active = YES;
  [_bannerView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor].active = YES;
}
  
- (BOOL)didUserSkipAd {
  return _bannerView.didUserSkipAd;
}
  
- (BOOL)didUserClickAd {
  return _bannerView.didUserClickAd;
}

- (BOOL)isAdMuted {
  return _bannerView.isAdMuted;
}

- (BOOL)isVideoTagReady {
  return _bannerView.isVideoTagReady;
}

- (BOOL)didVideoTagFail {
  return _bannerView.didVideoTagFail;
}

- (NSString *)descriptionOfFailure {
  return _bannerView.descriptionOfFailure;
}
  
- (NSError *)failureNSError {
  return _bannerView.failureNSError;
}

- (NSUInteger)adDuration {
  return [_bannerView getAdDuration];
}

- (NSUInteger)adPlayElapsedTime {
  return [_bannerView getAdPlayElapsedTime];
}

- (NSString *)creativeURL {
  return [_bannerView getCreativeURL];
}

- (NSString *)vastURL {
  return [_bannerView getVastURL];
}

- (NSString *)vastXML {
  return [_bannerView getVastURL];
}

- (void)startPlayingVideoAd {
  [_bannerView playAdWithContainer:self withDelegate:self];
}
  
- (void)stopPlayingVideoAd {
  [_bannerView removeAd];
}
  
- (void)reloadVideo {
  [self stopPlayingVideoAd];
  [self recreateAdView:self.placementId];
  [_bannerView loadAdWithDelegate:self];
}

- (void)adDidReceiveAd:(id<ANAdProtocol>)ad {  
  if (_onAdLoadSuccess) {
      _onAdLoadSuccess(@{ @"creativeId": ad.creativeId });
  }
}
  
- (void)ad:(id<ANAdProtocol>)ad requestFailedWithError:(NSError *)error {
  if (_onAdLoadFail) {
      _onAdLoadFail(@{@"error": error});
  }
}
  
- (void)adDidComplete:(id<ANAdProtocol>)ad withState:(ANInstreamVideoPlaybackStateType)state {
  if (_onPlayStatusChange) {
    NSNumber *stateNumber = nil;
    switch (state) {
      case ANInstreamVideoPlaybackStateError:
      stateNumber = @(state);
      break;
      case ANInstreamVideoPlaybackStateCompleted:
      stateNumber = @(state);
      break;
      case ANInstreamVideoPlaybackStateSkipped:
      stateNumber = @(state);
      break;

      default:
      break;
    }
    _onPlayStatusChange(@{ @"playbackState": stateNumber });
  }
}
  
- (void)adWasClicked:(id<ANAdProtocol>)ad {
  if (_onEventChange) {
    _onEventChange(@{ @"eventType": @(ANInstreamVideoEventAdWasClicked) });
  }
}
  
- (void)adWasClicked:(id<ANAdProtocol>)ad withURL:(NSString *)urlString {
  if (_onEventChange) {
    _onEventChange(@{ @"eventType": @(ANInstreamVideoEventAdWasClicked) });
  }
}
  
- (void)adDidClose:(id<ANAdProtocol>)ad {
  if (_onEventChange) {
    _onEventChange(@{ @"eventType": @(ANInstreamVideoEventAdClose) });
  }
}
  
- (void)adDidPresent:(id<ANAdProtocol>)ad {
  if (_onEventChange) {
    _onEventChange(@{ @"eventType": @(ANInstreamVideoEventDidPresent) });
  }
}
  
@end
