//
//  RACTestObject.m
//  ReactiveObjC
//
//  Created by Josh Abernathy on 9/18/12.
//  Copyright (c) 2012 GitHub, Inc. All rights reserved.
//

#import "RACTestObject.h"

@implementation RACTestObject

- (void)dealloc {
	free(_charPointerValue);
	free((void *)_constCharPointerValue);
}

- (void)setNilValueForKey:(NSString *)key {
	if (!self.catchSetNilValueForKey) [super setNilValueForKey:key];
}

- (void)setCharPointerValue:(char *)charPointerValue {
	if (charPointerValue == _charPointerValue) return;
	free(_charPointerValue);
	_charPointerValue = strdup(charPointerValue);
}

- (void)setConstCharPointerValue:(const char *)constCharPointerValue {
	if (constCharPointerValue == _constCharPointerValue) return;
	free((void *)_constCharPointerValue);
	_constCharPointerValue = strdup(constCharPointerValue);
}

- (void)setObjectValue:(id)objectValue andIntegerValue:(NSInteger)integerValue {
	self.hasInvokedSetObjectValueAndIntegerValue = YES;
	self.objectValue = objectValue;
	self.integerValue = integerValue;
}

- (void)setObjectValue:(id)objectValue andSecondObjectValue:(id)secondObjectValue {
	self.hasInvokedSetObjectValueAndSecondObjectValue = YES;
	self.objectValue = objectValue;
	self.secondObjectValue = secondObjectValue;
}

- (void)setSlowObjectValue:(id)value {
	[NSThread sleepForTimeInterval:0.02];
	_slowObjectValue = value;
}

- (NSString *)combineObjectValue:(id)objectValue andIntegerValue:(NSInteger)integerValue {
	return [NSString stringWithFormat:@"%@: %ld", objectValue, (long)integerValue];
}

- (NSString *)combineObjectValue:(id)objectValue andSecondObjectValue:(id)secondObjectValue {
	return [NSString stringWithFormat:@"%@: %@", objectValue, secondObjectValue];
}

- (void)lifeIsGood:(id)sender {
	
}

+ (void)lifeIsGood:(id)sender {
	
}

- (NSRange)returnRangeValueWithObjectValue:(id)objectValue andIntegerValue:(NSInteger)integerValue {
	return NSMakeRange((NSUInteger)[objectValue integerValue], (NSUInteger)integerValue);
}

- (RACTestObject *)dynamicObjectProperty {
	return [self dynamicObjectMethod];
}

- (RACTestObject *)dynamicObjectMethod {
	RACTestObject *testObject = [[RACTestObject alloc] init];
	testObject.integerValue = 42;
	return testObject;
}

- (void)write5ToIntPointer:(int *)intPointer {
	NSCParameterAssert(intPointer != NULL);
	*intPointer = 5;
}

- (NSInteger)doubleInteger:(NSInteger)integer {
	return integer * 2;
}

- (char *)doubleString:(char *)string {
	size_t doubledSize = strlen(string) * 2 + 1;
	char *doubledString = malloc(sizeof(char) * doubledSize);

	doubledString[0] = '\0';
	strlcat(doubledString, string, doubledSize);
	strlcat(doubledString, string, doubledSize);

	dispatch_async(dispatch_get_main_queue(), ^{
		free(doubledString);
	});

	return doubledString;
}

- (const char *)doubleConstString:(const char *)string {
	return [self doubleString:(char *)string];
}

- (RACTestStruct)doubleStruct:(RACTestStruct)testStruct {
	testStruct.integerField *= 2;
	testStruct.doubleField *= 2;
	return testStruct;
}

- (dispatch_block_t)wrapBlock:(dispatch_block_t)block {
	return ^{
		block();
	};
}

@end
