//
//  TargetMouseScroll.m
//  Enjoy
//
//  Created by Yifeng Huang on 7/28/12.
//

#import "TargetMouseScroll.h"

@implementation TargetMouseScroll {
    int sign;
}

+ (NSString *)serializationCode {
    return @"mscroll";
}

- (NSDictionary *)serialize {
    return @{ @"type": @"mscroll", @"amount": @(_amount) };
}

+ (Target *)targetDeserialize:(NSDictionary *)serialization
                  withConfigs:(NSArray *)configs {
	TargetMouseScroll *target = [[TargetMouseScroll alloc] init];
    target.amount = [serialization[@"amount"] intValue];
	return target;
}

- (void)trigger {
    if (!self.magnitude) {
        CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
                                                          kCGScrollEventUnitLine,
                                                          1,
                                                          _amount);
        CGEventPost(kCGHIDEventTap, scroll);
        CFRelease(scroll);
    }
}

- (BOOL)update:(NJInputController *)jc {
    if (fabsf(self.magnitude) < 0.01f) {
        sign = 0;
        return NO; // dead zone
    }
    
    // If the input crossed over High/Low, this target is done.
    if (!sign)
        sign = self.magnitude < 0 ? -1 : 1;
    else if (sign / self.magnitude < 0) {
        sign = 0;
        return NO;
    }

    int amount = (int)(16.f * fabsf(self.magnitude) * _amount);
    CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
                                                      kCGScrollEventUnitPixel,
                                                      1,
                                                      amount);
    CGEventPost(kCGHIDEventTap, scroll);
    CFRelease(scroll);

    return YES;
}

- (BOOL)isContinuous {
    return YES;
}

@end
