//
//  NSMutableURLRequest+Courier.m
//  Courier
//
//  Created by Andrew Smith on 7/25/13.
//  Copyright (c) 2013 Andrew B. Smith ( http://github.com/drewsmits ). All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
// of the Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//

#import "NSMutableURLRequest+Courier.h"

#import "NSDictionary+Courier.h"

@implementation NSMutableURLRequest (Courier)

+ (NSMutableURLRequest *)cou_requestWithMethod:(NSString *)method
                                      path:(NSString *)path
{
    return [self cou_requestWithMethod:method
                              path:path
                          encoding:CRURLRequestEncodingUnknown
                     URLParameters:nil
                HTTPBodyParameters:nil
                            header:nil];
}

+ (NSMutableURLRequest *)cou_requestWithMethod:(NSString *)method
                                          path:(NSString *)path
                                      encoding:(CRURLRequestEncoding)encoding
                                 URLParameters:(NSDictionary *)urlParameters
                            HTTPBodyParameters:(NSDictionary *)httpBodyParameters
                                        header:(NSDictionary *)header
{
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    
    [request setURLPath:path withParameters:urlParameters];
    [request setHTTPMethod:method];
    [request setHTTPBodyDataWithParameters:httpBodyParameters encoding:encoding];
    [request setAllHTTPHeaderFields:header];
    
    // Only add content type if there are body params. Play! filters seems to
    // have an issue with setting Content-Type header but not provide a body.
    if (httpBodyParameters && httpBodyParameters.count > 0) {
        [request addHeaderContentTypeForEncoding:encoding];
    }
    
    return request;
}

#pragma mark - URL

- (void)setURLPath:(NSString *)path
    withParameters:(NSDictionary *)parameters
{
    //
    // Append path with URL params, if present
    //
    if (parameters.count > 0) {
        NSString *stringToAppend = [path rangeOfString:@"?"].location == NSNotFound ? @"?%@" : @"&%@";
        NSString *newPath = [path stringByAppendingFormat:stringToAppend, [parameters cou_asFormURLEncodedString]];
        path = newPath;
    }
    
    self.URL = [NSURL URLWithString:path];
}

#pragma mark - Header

- (void)addHeaderContentTypeForEncoding:(CRURLRequestEncoding)encoding
{
    //
    // Bail if content type is already set
    //
    if (self.allHTTPHeaderFields[@"Content-Type"]) return;

    //
    // Set the content type
    //
    if (encoding == CRURLFormURLParameterEncoding) {
        // Form URL
        NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
        NSString *type = [NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@", charset];
        [self addValue:type forHTTPHeaderField:@"Content-Type"];
    } else if (encoding == CRURLJSONParameterEncoding) {
        // JSON
        [self addValue:@"application/json,text/json,text/javascript" forHTTPHeaderField:@"Content-Type"];
    } else if (encoding == CRURLImageEncoding) {
        [self addValue:@"image/tiff,image/jpeg,image/gif,image/png,image/ico,image/x-icon,image/bmp,image/x-bmp,image/x-xbitmap,image/x-win-bitmap"
    forHTTPHeaderField:@"Content-Type"];
    }
}

#pragma mark - Body

- (void)setHTTPBodyDataWithParameters:(NSDictionary *)parameters
                             encoding:(CRURLRequestEncoding)encoding
{
    if (!parameters) return;
    
    NSData *bodyData = nil;
    
    if (encoding == CRURLFormURLParameterEncoding) {
        // Form URL
        bodyData = [parameters cou_asFormURLEncodedData];
    } else if (encoding == CRURLJSONParameterEncoding) {
        // JSON
        bodyData = [parameters cou_asJSONData];
    } else {
        // Unknown encoding. Pass it through.
        bodyData = [NSKeyedArchiver archivedDataWithRootObject:parameters];
    }
    
    [self setHTTPBody:bodyData];
}

@end
