#import "TrackingSlider.h"
#import "TrackingCell.h"

@implementation TrackingSlider

static NSString *TrackingSliderValueObservationContext = @"TrackingSliderValueObservationContext";

- (id)initWithFrame:(NSRect)frameRect {
	self = [super initWithFrame:frameRect];
	if(self) {
		bindingInfo = [[NSMutableDictionary alloc] init];
	}

	return self;
}

- (id)initWithCoder:(NSCoder *)decoder {
	self = [super initWithCoder:decoder];
	if(self) {
		bindingInfo = [[NSMutableDictionary alloc] init];
	}

	return self;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
	if([TrackingSliderValueObservationContext isEqual:(__bridge id)(context)]) {
		if(![self isTracking]) {
			id value = [change objectForKey:NSKeyValueChangeNewKey];
			[self setDoubleValue:[value doubleValue]];
		}
	} else {
		[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
	}
}

- (void)bind:(NSString *)binding toObject:(id)observableController withKeyPath:(NSString *)keyPath options:(NSDictionary *)options {
	if([binding isEqualToString:@"value"]) {
		[observableController addObserver:self forKeyPath:keyPath options:(NSKeyValueObservingOptionNew)context:(__bridge void *_Nullable)(TrackingSliderValueObservationContext)];

		NSDictionary *bindingsData = @{NSObservedObjectKey: observableController,
									   NSObservedKeyPathKey: [keyPath copy],
									   NSOptionsKey: options ? [options copy] : @{}};

		[bindingInfo setObject:bindingsData forKey:binding];
	} else {
		[super bind:binding toObject:observableController withKeyPath:keyPath options:options];
	}
}

- (void)unbind:(NSString *)binding {
	if([binding isEqualToString:@"value"]) {
		NSDictionary *info = [bindingInfo objectForKey:binding];

		NSString *keyPath = [info objectForKey:NSObservedKeyPathKey];
		id observedObject = [info objectForKey:NSObservedObjectKey];

		[observedObject removeObserver:self forKeyPath:keyPath];
	} else {
		[super unbind:binding];
	}
}

- (BOOL)isTracking {
	return [[self cell] isTracking];
}

@end