#import "RNNScreenTransition.h"
#import "OptionsArrayParser.h"

@implementation RNNScreenTransition

- (instancetype)initWithDict:(NSDictionary *)dict {
	self = [super init];

	self.topBar = [[ElementTransitionOptions alloc] initWithDict:dict[@"topBar"]];
	self.content = [[ElementTransitionOptions alloc] initWithDict:dict[@"content"]];
	self.bottomTabs = [[ElementTransitionOptions alloc] initWithDict:dict[@"bottomTabs"]];
	self.enable = [BoolParser parse:dict key:@"enabled"];
	self.waitForRender = [BoolParser parse:dict key:@"waitForRender"];
    self.duration = [TimeIntervalParser parse:dict key:@"duration"];
    self.sharedElementTransitions = [OptionsArrayParser parse:dict key:@"sharedElementTransitions" ofClass:SharedElementTransitionOptions.class];
	self.elementTransitions = [OptionsArrayParser parse:dict key:@"elementTransitions" ofClass:ElementTransitionOptions.class];
    
	return self;
}

- (BOOL)hasCustomAnimation {
	return (self.topBar.hasAnimation || self.content.hasAnimation || self.bottomTabs.hasAnimation || self.sharedElementTransitions || self.elementTransitions);
}

- (BOOL)shouldWaitForRender {
    return [self.waitForRender getWithDefaultValue:NO] || self.hasCustomAnimation;
}

- (NSTimeInterval)maxDuration {
	NSTimeInterval maxDuration = 0;
	if ([self.topBar maxDuration] > maxDuration) {
		maxDuration = [self.topBar maxDuration];
	}
    
	if ([self.content maxDuration] > maxDuration) {
		maxDuration = [self.content maxDuration];
	}
    
	if ([self.bottomTabs maxDuration] > maxDuration) {
		maxDuration = [self.bottomTabs maxDuration];
	}
    
    for (ElementTransitionOptions* elementTransition in self.elementTransitions) {
        if (elementTransition.maxDuration > maxDuration) {
            maxDuration = elementTransition.maxDuration;
        }
    }
    
    for (SharedElementTransitionOptions* sharedElementTransition in self.sharedElementTransitions) {
        if (sharedElementTransition.maxDuration > maxDuration) {
            maxDuration = sharedElementTransition.maxDuration;
        }
    }
	
	return maxDuration;
}

@end