#import "LSStubResponse.h"

@interface LSStubResponse ()
@property (nonatomic, assign, readwrite) NSInteger statusCode;
@property (nonatomic, strong) NSMutableDictionary *mutableHeaders;
@property (nonatomic, assign) UInt64 offset;
@property (nonatomic, assign, getter = isDone) BOOL done;
@property (nonatomic, assign) BOOL shouldFail;
@property (nonatomic, strong) NSError *error;
@end

@implementation LSStubResponse

#pragma Initializers
- (id)initDefaultResponse {
    self = [super init];
    if (self) {
        self.shouldFail = NO;

        self.statusCode = 200;
        self.mutableHeaders = [NSMutableDictionary dictionary];
        self.body = [@"" dataUsingEncoding:NSUTF8StringEncoding];
    }
    return self;
}


- (id)initWithError:(NSError *)error {
    self = [super init];
    if (self) {
        self.shouldFail = YES;
        self.error = error;
    }
    return self;
}

-(id)initWithStatusCode:(NSInteger)statusCode {
    self = [super init];
    if (self) {
        self.shouldFail = NO;
        self.statusCode = statusCode;
        self.mutableHeaders = [NSMutableDictionary dictionary];
        self.body = [@"" dataUsingEncoding:NSUTF8StringEncoding];
    }
    return self;
}

- (id)initWithRawResponse:(NSData *)rawResponseData {
    self = [self initDefaultResponse];
    if (self) {
        CFHTTPMessageRef httpMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, FALSE);
        if (httpMessage) {
            CFHTTPMessageAppendBytes(httpMessage, [rawResponseData bytes], [rawResponseData length]);
            
            self.body = rawResponseData; // By default
            
            if (CFHTTPMessageIsHeaderComplete(httpMessage)) {
                self.statusCode = (NSInteger)CFHTTPMessageGetResponseStatusCode(httpMessage);
                self.mutableHeaders = [NSMutableDictionary dictionaryWithDictionary:(__bridge_transfer NSDictionary *)CFHTTPMessageCopyAllHeaderFields(httpMessage)];
                self.body = (__bridge_transfer NSData *)CFHTTPMessageCopyBody(httpMessage);
            }
            CFRelease(httpMessage);
        }
    }
    return self;
}

- (void)setHeader:(NSString *)header value:(NSString *)value {
    [self.mutableHeaders setValue:value forKey:header];
}
- (NSDictionary *)headers {
    return [NSDictionary dictionaryWithDictionary:self.mutableHeaders];
}

- (NSString *)description {
    return [NSString stringWithFormat:@"StubRequest:\nStatus Code: %ld\nHeaders: %@\nBody: %@",
            (long)self.statusCode,
            self.mutableHeaders,
            self.body];
}
@end
